myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » String-Aufbau: KeyWord=Value1, Value2, Value3 - Umformatieren
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Automatinator
myCSharp.de-Mitglied

Dabei seit: 06.02.2020
Beiträge: 18
Entwicklungsumgebung: VS2017
Herkunft: C#-Programmierlevel: Anfänger


Automatinator ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Automatinator am 19.03.2020 13:15.

Neuer Beitrag 19.03.2020 13:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.013
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
Neuer Beitrag 19.03.2020 13:12 Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

avatar-4140.png


Dabei seit: 03.02.2012
Beiträge: 1.277
Entwicklungsumgebung: Visual Studio 2019
Herkunft: NRW


Palladin007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palladin007 am 19.03.2020 16:17.

Neuer Beitrag 19.03.2020 13:48 Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.478
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
Neuer Beitrag 19.03.2020 14:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Automatinator
myCSharp.de-Mitglied

Dabei seit: 06.02.2020
Beiträge: 18
Entwicklungsumgebung: VS2017
Herkunft: C#-Programmierlevel: Anfänger

Themenstarter Thema begonnen von Automatinator

Automatinator ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Vielen Dank
herbivore
Palladin007
Abt

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

C#-Code:
        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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Automatinator am 19.03.2020 19:45.

Neuer Beitrag 19.03.2020 19:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.478
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
Neuer Beitrag 19.03.2020 21:27 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.013
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ist übrigens ein super Beispiel um  Testgetriebene Entwicklung zu lernen
Neuer Beitrag 19.03.2020 23:23 Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.566
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
Neuer Beitrag 20.03.2020 08:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.478
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
Neuer Beitrag 20.03.2020 09:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.566
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@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
Neuer Beitrag 20.03.2020 09:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Automatinator
myCSharp.de-Mitglied

Dabei seit: 06.02.2020
Beiträge: 18
Entwicklungsumgebung: VS2017
Herkunft: C#-Programmierlevel: Anfänger

Themenstarter Thema begonnen von Automatinator

Automatinator ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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. enttäuscht
Neuer Beitrag 20.03.2020 12:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.013
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
Neuer Beitrag 20.03.2020 12:43 Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.478
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Automatinator,

Zitat:
... 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.

Zitat:
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
Neuer Beitrag 20.03.2020 14:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.566
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
Neuer Beitrag 20.03.2020 14:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 4 Monate.
Der letzte Beitrag ist älter als 4 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 09.08.2020 05:25