Laden...

String-Aufbau: KeyWord=Value1, Value2, Value3 - Umformatieren

Erstellt von Automatinator vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.753 Views
A
Automatinator Themenstarter:in
18 Beiträge seit 2020
vor 4 Jahren
String-Aufbau: KeyWord=Value1, Value2, Value3 - Umformatieren

Hallo zusammen

Ausgangslage
Ich habe folgender String-Aufbau:

KeyWord=Value1, Value2, Value3, ...

Beispiele:

Auto=Toyota, 4, 2
LKW=2
Velo=1, 2, 0, 1, 2

Meine Fragen:

  1. Das ist doch eine spezielle bekannte Anordnung der Daten, weiss jemand wie das Konzept heisst?

  2. Weil es ein bekannter (normierter?) Aufbau ist, gibt es da schon eine Klasse die mit diesen Daten hantiert?

Mein Ziel:
Ich würde gerne auf eine elegante Art die Werte (Value1,2 usw.) in einen Array of String eintragen. Wobei die Anzahl Werte beliebig (<100) sein können.


Velo=1, 2, 0, 1, 2

wird zu

myStringArray[0]=1
myStringArray[1]=2
myStringArray[2]=0
myStringArray[3]=1
myStringArray[4]=2

(ohne Symbole und Leerzeichen)

Vielen Dank für die Tips und Infos, ich erwarte hier logischerweise keine fertigen Lösungen.
Nur wie dieser Textdaten-Aufbau in Fachkreisen genannt wird (damit ich danach googlen kann)
Und ob es schon eine Klasse oder Bibliothek gibt, die diese elegant Behandelt.

Gruss
Marc

16.806 Beiträge seit 2008
vor 4 Jahren

Prinzipiell muss man von der Datenhaltung und der Datendarstellung unterscheiden.
Man kann nicht immer von der Darstellung direkt auf die Haltung schließen.

An für sich hast Du aber offenbar einfach nur ein Array.

Willst Du also einfach einen String in ein Array konvertieren?
Google-Suche nach c# string to array

Das behandelt prinzipiell aber jedes Grundlagen-Tutorial zu C# 😃
Geb Dir daher nochmals den Hinweis einfach mal 1-2 Stunden Tutorials durchzuarbeiten. Damit kommt man aus Erfahrung danach dann viel schneller voran.

2.078 Beiträge seit 2012
vor 4 Jahren

Ob es dafür einen Namen und vorhandene Klassen gibt, weiß ich nicht.
Mich erinnert es an INI-Dateien, aber die können glaube ich keine Listen.

Das Interpretieren der Daten dürfte aber nicht sehr schwer sein:
*Splitten nach NewLine oder direkt zeilenweise lesen *Splitten nach Gleich-Zeichen -> Key und Werte-String *Splitten nach Komma-Zeichen -> Die Werte *Trim der Werte

Das wäre so die mit Abstand einfachste Weise, das zu lesen, beachtet allerdings keine escapten Werte.
Oder Du nutzt Regex, das bietet noch ein paar mehr Möglichkeiten, ohne riesige Mengen Code zu brauchen.

49.485 Beiträge seit 2005
vor 4 Jahren

Hallo Automatinator,

die Darstellung mit dem Gleichheitszeichen heißt Key-Value-Pairs (Schlüssel-Wert-Paare), wie sie in den von Palladin007 genannten Initialisierungsdateien Verwendung finden.

Die Darstellung mit dem Komma heißt CSV, also Comma-separated values.

Für die Kombination aus beiden gibt es möglicherweise keinen Namen, jedenfalls ist mir keiner bekannt.

Entsprechend kenne ich keine Klassen, die das in dieser Kombination behandeln. Man könnte aber Klassen für INI-Dateien mit welchen für CSV kombinieren, um das Problem (in zwei direkt aufeinander folgenden Schritten) zu lösen.

Die Ergebnis-Datenstruktur wäre wohl besser ein Dictionary von Arrays (oder Listen) statt nur ein Array, also Dictionary <String, String []>.

herbivore

A
Automatinator Themenstarter:in
18 Beiträge seit 2020
vor 4 Jahren

Vielen Dank
herbivore
Palladin007
Abt

Ich habe eure Tips ausprobiert hier meine funktionierende Lösung:


        public string[] SearchTrimSplitString(string sInputString, string sKeyWord)
        {
            string[] asRetValColumnData;

            //search match for KeyWord
            if (sInputString.StartsWith(sKeyWord))
            {
                //Remove blank space via Trim
                string sTrimmedInputString = sInputString.Trim();

                // Remove Keyword
                string sShortedInputString = sTrimmedInputString.Replace(sKeyWord, null);

                //Split
                asRetValColumnData = sShortedInputString.Split(',');

            }
            else
            {
                asRetValColumnData = null;
            }

            return asRetValColumnData;
        }


Das ',' bewusst alles fixes Split-Symbol

49.485 Beiträge seit 2005
vor 4 Jahren

Hallo Automatinator,

ich finde, da passen ein paar Sachen nicht zueinander.

Das Trimmen sollte am Schluss für alle Einzelwerte erfolgen. Jedenfalls nicht zwischen der Abfrage und dem Replace. Das Trim bedeutet ja, dass du mit überflüssigen Leerzeichen rechnest. Bei deiner momentanen Konstruktion würde StartsWith aber gerade nicht true liefern, wenn vor dem Keyword mindestens ein Leerzeichen steht.

Und was ist mit dem Gleichheitszeichen? Wenn sKeyWord nur das Wort ohne Gleichheitszeichen enthält (was nach dem Namen des Parameters zu vermuten ist), dann ist das Gleichheitszeichen in sTrimmedInputString weiterhin enthalten.

Außerdem ersetzt Replace alle Vorkommen, bei "a=Hallo" also auch das a von Hallo.

Davon abgesehen würde ich das KeyWord gar nicht als Parameter übergeben, sondern sehe es als Teil des Ergebnisses der Methode. Das KeyWord ist eben das, was vor dem (ersten) Gleichheitszeichen steht (natürlich wieder getrimmt). Es ist also eindeutig zu erkennen, auch wenn es nicht explizit übergeben wird.

So leicht wie die Aufgabe aussieht, ist sie nicht, wenn man alle denkbaren Fälle auch korrekt behandeln will.

herbivore

16.806 Beiträge seit 2008
vor 4 Jahren

Ist übrigens ein super Beispiel um Testgetriebene Entwicklung zu lernen

T
2.219 Beiträge seit 2008
vor 4 Jahren

Entsprechend herbivores Ansatz solltest du dann auch anstelle von string[] dann z.B. ein Objekt liefern, was eine KeyWord Property und eine Liste von Strings mit den Werten hat.
Dann kannst du das Ergebnis sauber als eigenes Objekt mappen, als ERgenis liefern und verarbeiten.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

49.485 Beiträge seit 2005
vor 4 Jahren

Hallo T-Virus,

wenn du mit "eigenes Objekt" nicht auch gleich eine eigene Klasse meinst, stimme ich dir voll zu. Hier würde wohl am ehesten ein KeyValuePair <String, String[]> das passende "eigene Objekt" sein.

Und die kann man dann außerhalb der Methode in das schon vorgeschlagene Dictionary <String, String []> übertragen.

herbivore

T
2.219 Beiträge seit 2008
vor 4 Jahren

@herbivore
Genau das meinte ich 😃
Natürlich reicht auch der KeyValuePair Ansatz samt Dictionary.
Wenn es keine doppelten KeyWords gibt, wäre dies auch der einfachste Ansatz.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

A
Automatinator Themenstarter:in
18 Beiträge seit 2020
vor 4 Jahren

Ich weiss, das ich nicht immer die eleganteste Lösung programmiere, aber ich hab nur begrenzt zeit und es muss funktionieren.

KeyWords komm niemals in den Values auch als substring nicht vor

Entweder versteh ich das Dictonary nicht oder es kann zu wenig für meine Anwendung. X(

16.806 Beiträge seit 2008
vor 4 Jahren

Das Problem bei Software ist, dass Halbwissen und Zeitdruck i.d.R. im Chaos enden.
Daher ist es immer ratsam, dass Du ein paar Minuten in die Doku investierst.

Natürlich aber kannst Du auch 3 Stunden in "Ausprobieren" investieren, statt 20 Minuten zu lesen.
Das ist Dir überlassen.

49.485 Beiträge seit 2005
vor 4 Jahren

Hallo Automatinator,

... und es muss funktionieren.

in meinen Augen funktioniert eben noch nicht alles richtig, oder zumindest nur, wenn die Eingabedaten bestimmte Voraussetzungen erfüllen (und wenn nicht geht es eben echt schief).

Konkret erfüllt die Methode deine Forderung aus dem Beispiel nicht, die Leerzeichen um die Einzelwerte herum zu entfernen.

Entweder versteh ich das Dictonary nicht ...

Was nicht ist, kann ja noch werden 😃

Um Dein Beispiel zu nehmen

Velo=1, 2, 0, 1, 2

wird zu

myDictionary ["Velo"] [1]=1
myDictionary ["Velo"] [1]=2
myDictionary ["Velo"] [2]=0
myDictionary ["Velo"] [3]=1
myDictionary ["Velo"] [4]=2

Die Initialisierung des Arrays kommt genauso wie bei deinem Code noch dazu (per Rückgabewert von String.Split), nur wird es nicht an die Variable myStringArray zugewiesen, sondern an myDictionary ["Velo"]. Und myDictionary muss natürlich vorher einmal mit einem Dictionary initialisiert werden.

Das Dictionary hilft dir dabei, alle Wert-Arrays in einer Datenstruktur (eben dem Dictionary) zusammenzufassen. Du könntest dann z.B. eine Methode schreiben, die eine ganze Datei einliest und als Dictionary zurückliefert, statt nur jeweils eine Zeile der Datei als Array.

Das ist einfach nur praktisch, aber natürlich nicht zwingend erforderlich.

herbivore

T
2.219 Beiträge seit 2008
vor 4 Jahren

Das Dictioanry ist für deinen Fall dann genau das richtige.
Der Ansatz von herbivore ist auch genau das was du am Ende brauchst.
In der Doku ist es auch in Deutsch gut erklärt und verständlich gemacht.
Ebenfalls hast du einfache Beispiele und kannst mit etwas Übung dann auch deinen aktuellen Ansatz damit verfeiern.

Von einer überhasteten Lösung würde ich auch abraten.
Solche Lösungen mögen zwar das Problem lösen können, aber spätestens bei Änderungen der Anforderungen muss man dann meistens den gesamten Code verwerfen und neuschreiben.
Deshalb würde ich gleich eine saubere Lösung umsetzen, spart dir dann hinterher viel Zeit.
Vorallem wenn du den Code heute schreibst und in X Wochen/Monaten dann wieder den Code anfassen musst, macht es ihn verständlicher.

Dictionary

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.