Laden...

String aus CSV an Trennzeichen splitten, wenn das Trennzeichen auch in den Werten vorkommen kann

Erstellt von aken0 vor 9 Jahren Letzter Beitrag vor 9 Jahren 5.521 Views
Thema geschlossen
A
aken0 Themenstarter:in
8 Beiträge seit 2014
vor 9 Jahren
String aus CSV an Trennzeichen splitten, wenn das Trennzeichen auch in den Werten vorkommen kann

Hey,

ich möchte gerne folgenden String splitten:
"kunde1";"Firma1;Bla";"Test"Info"";

Texttrennzeichen: "
Spaltentrennzeichen: ;

Mein Problem ist eigentlich, dass ich nicht weiß, wie ich den String splitten soll...
Denn string.splitt(';') fällt ja Flach, da sonst der String falsch gesplittet wird.

Das ganze soll dann später eine CSV Datei fehlertollerant lesen, mir geht es aber derzeit nur um das splitten eines Strings.

Wie könnte ich da ansetzen?
(Ich möchte keinen FertigCode, sondern nur Ansätze, Methoden/Klassennamen)

16.792 Beiträge seit 2008
vor 9 Jahren

Es gibt genug Bibliotheken, die CSV Dateien zuverlässig parsen können.
C# CSV Reader and Writer

Ich möchte keinen FertigCode, sondern nur Ansätze, Methoden/Klassennamen

Guer Vorsatz aber man muss das Rad nicht neu erfinden. Steckt ja mehr drin als eben nur Split. Also wieso nicht auf bewährtes Zurückgreifen?

Man macht das selbst, das einem von anderen unterscheidet.
Parsen von Standard Formaten gehört da eher nicht dazu.

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo aken0,

falls du eine Excel-File lesen willst: Es gibt für excel-sachen recht gute und einfache Libraries:

https://exceldatareader.codeplex.com/ zum Beispiel. (Habe es aber mit csv noch nicht probiert).

Konkret in deinem Fall kannst du doch am ";" splitten, und dann die " mit einem Leerzeichen ersetzen. Falls dir das hilft. (--> das führt nicht zu einer 100%igen Lösung. Ist aber ein Ansatz.)

Umgang mit Strings setzen wir aber als Grundlagen vorraus. Siehe auch: [FAQ] Wie finde ich den Einstieg in C#?
Wenn es hier also weiter um Grundlagen geht würde der Thread geschlossen werden.

Gruss

Coffeebean

====

Zu spät 😉 Ich lasse mal stehen wegen dem andren Lib-Link

2.078 Beiträge seit 2012
vor 9 Jahren

Stichwort: Regex

Oder du läufst selber von Anfang bis Ende durch den String, merkst du, ob du gerade in einem Wert-Bereich bist oder eben nicht und legst die einzelnen Werte dann in einer Liste ab. Beachte aber, dass in einem Wert auch Anführungszeichen vorkommen können.

Muss jeder selber entscheiden, auf was von Beidem die Wahl fällt.
In so kleinem Umfang würde ich das lieber selber implementieren, weil ich das besser kann.
Bei komplexeren Systemen nimmt das Parsen von bestimmten Text aber schnell Überhand, da verwende ich dann auch Regex.

Aber es gibt einiges, was man dazu bei Google finden kann und bestimmt auch die eine oder andere fertige Library (Coffeebean und Abt haben ja schon welche genannt), die du nutzen kannst.

S
145 Beiträge seit 2013
vor 9 Jahren

da gibts schon was von ratiopha... eh microsoft
TextFieldParser-Klasse

musst nur als referenz Microsoft.VisualBasic noch mit in dein projekt aufnehmen.

R
57 Beiträge seit 2014
vor 9 Jahren

Das ganze ist geschäftlich und darf leider auf keine "externen" Bibliotheken benutzen.

Edit: Guter Tipp, dass ich den String bei ";" splitten kann, ist mir vollkommen entgangen

2.078 Beiträge seit 2012
vor 9 Jahren

Wenn du nur bei ';' splittest, sehen die Daten von deinem obigen Beispiel danach so aus:

"kunde1"
"Firma1"
"Bla"
"Test"Info""

Wenn ich das richtig Verstanden habe, sollen die aber so aussehen:

kunde1
Firma1;Bla
Test"Info"

Die Anführungszeichen lassen sich leicht entfernen, aber Split alleine reicht nicht aus.

C
2.121 Beiträge seit 2010
vor 9 Jahren

Wo ist der Unterschied zwischen Texttrennzeichen und Spaltentrennzeichen?
Wenn nichts externes verwendet werden soll würde ich mir selber was schreiben. Durchlaufe den String, merk dir den Index von Trennzeichen und dann hole dir die passenden Textstellen aus dem String.
Dazu solltest du aber wissen wie die Texte wirklich getrennt sind. Wenn ein " und ; wirklich Teil des Textes sein dürfen, sollten sie richtig und vollständig gesetzt sein.

R
57 Beiträge seit 2014
vor 9 Jahren

Kann man leider nicht wissen, ob die Trennzeichen richtig gesetzt sind.

Der Sinn vom "" ist, das in diesem Text steht, welcher auch Sonderzeichen beinhalten kann wie z.b ;. Damit kann ich unterscheiden ob das ; nur Text ist, oder eine Trennung darstellt.

S
145 Beiträge seit 2013
vor 9 Jahren

schau dir oben den TextFieldParser an.
Da kannste Trennzeichen angeben und ob Textbereiche in Hochkommas stehen.

16.792 Beiträge seit 2008
vor 9 Jahren

Das ganze ist geschäftlich und darf leider auf keine "externen" Bibliotheken benutzen.

Gerade im Hinblick auf Unternehmen und Effizient ist das - aus meiner Sicht - ein enorm kostspieliger Gedanke. Ihr verschenkt damit unnötig Ressourcen.
Es gibt genug Bibliotheken /fertiger und getesteter Quellcode, die auch die nötigen Lizenzen (zB MIT / MSPL) für kommerzielle Umgebungen mitbringen.

C
2.121 Beiträge seit 2010
vor 9 Jahren

Das mit der vergeudeten Zeit stimmt natürlich. Dieser Fall hört sich allerdings an als wären hier besondere Bedingungen im Spiel. Die könnten die Suche nach was fertigem erschweren.

Kann man leider nicht wissen, ob die Trennzeichen richtig gesetzt sind.

"Richtig" gesetzt im Sinne von "in eine Regel fassbar" sollten die Trennzeichen natürlich schon sein.
Kannst du eine Regel formulieren? Wenn das eindeutig ist kannst du entweder eine fertige Bibliothek finden die das so kann, oder du baust dir selbst ein Stück Code das den Text nach dieser Regel auseinandernimt.
Das hört sich alles nicht nach stundenlangem Programmieren an. Ich würde sagen simple CSV Daten auseinandernehmen ist schneller selbst programmiert als was fertiges überhaupt zu finden 😃
CSV mit Sonderbehandlung ist nicht ganz so schnell selbst gemacht, dafür dauert die Suche nach was fertigem aber auch länger.
Also erklär uns doch mal die Regeln für deine Formatierung. Was soll in deinem Beispiel als Ergebnis rauskommen?

R
57 Beiträge seit 2014
vor 9 Jahren

Gut Folgende Regeln sind definiert:
Eine Spalte wir immer mit einem Semikolon abgegrenzt.
Danach folgt der Text, dieser steht in "", da man nicht sicherstellen kann,
ob im Text auch ein Semikolon vorhanden ist.

Folgende Beispiele:
"Text1"; -> Text1
"Text1;Text2"; -> Text1;Text2
"Text1"T"ext2"; -> Text1"T"ext2

Das heißt, dass ich mir das erste " suchen muss, danach zum letzen Semikolon und überprüfen, ob eine Stelle davor ein " steht, ansonsten -> Formaterror (außer der letze Block, dieser besitzt kein ;, da überprüfe ich einfach das letzte Zeichen.

So nur zur Praxis, wie kann ich Strings "durch wandern" und nach Zeichen und deren Index abfragen? (Würde zwar mit nem char[] geheh, finde ich aber umständlich! oder kann man das so machen?)

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo Repac3r,

du kannst einen String per foreach durchlaufen. Oder du kannst auf die Zeichen eines Strings direkt per Index zugreifen. Eine Konvertierung in ein char-Array ist also nicht nötig.

Spätestens damit sind wir aber bei den Grundlagen, die wir als bekannt voraussetzen, also bei [Hinweis] Wie poste ich richtig? Punkt 1.1.1 angekommen.

Außerdem ist das ein absolutes Standard-Problem. Es gibt genug fertige Bibliotheken Netz. Wenn die die nicht benutzen darfst, gibt es auch genug (fertigen) Code, den man per Copy&Pase (zumindest als Grundlage) verwenden kann. Und wenn auch das nicht in Frage kommt, gibt es genug bestehende Artikel und Forenbeiträge, in denen Lösungen vorgeschlagen werden.(

Bitte beachte insofern auch Punkt 1.1.

herbivore

Thema geschlossen