![]() |
DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes sind
Hallo Leute :-)
Vorweg: "Double quotes as a string encapsulator is a feature of the CSV specifications" Ich will eine UTF-8 Textdate einladen und die "Felder" auslesen und in meine Tabelle schreiben (die CSV Datei bekomme ich von einer anderen Software) Struktur der CSV-Textdatei: Kundennummer;Kundenname;Plz;Ort Beispiel: 001;Hotel Huber;12345;Ort 002;Huber Hotel;12345;Ort 003;Hotel "Huber";12345;Ort 004;"Huber" Hotel;12345;Ort Der Fehler kommt nun in Zeile 4 .. weil das " gleich nach dem ; kommt vermute ich. Die CSV-Datei kann ich nicht ändern - wie kann ich via Delphi das Problem mit dem führenden Doublequote lösen? Wie ich es aktuell mache:
Delphi-Quellcode:
sl := TStringList.Create;
slRow := TStringList.Create; slRow.StrictDelimiter := true; slRow.Delimiter := ';'; try sl.LoadFromFile(datenpfad + '\' + dateiname, TEncoding.UTF8); for line := 0 to sl.Count-1 do begin slRow.DelimitedText := sl[line]; t0 := slRow[0]; t1 := slRow[1]; t2 := slRow[2]; t3 := slRow[3]; Importtabelle.Append; Importtabelle.FieldByName('Datenquelle').AsInteger := 1; Importtabelle.FieldByName('Kundennummer').AsString := t0; Importtabelle.FieldByName('Kundenname').AsString := t1; Importtabelle.FieldByName('Postleitzahl').AsString := t2; Importtabelle.FieldByName('Ort').AsString := t3; Importtabelle.post; end; |
AW: DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes s
Würde folgende Idee das Problem lösen und keine weiteren Probleme verursachen??
.. sl.LoadFromFile(datenpfad + '\' + dateiname, TEncoding.UTF8); sl.Text := StringReplace(sl.Text, ';"','; "', [rfIgnoreCase, rfReplaceAll]); .. Also ein Leerzeichen zwischen ; und " reinsetzen? |
AW: DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes s
Da die CSV nicht den Spezifikationen entspricht und du darauf wohl keinen Einfluss hast, bleibt dir nicht anderes übrig als die Zeilen mit einem eigenen Algorithmus in die Felder zu splitten, anstatt sich auf die Logik von DelimitedText zu verlassen.
|
AW: DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes s
Was soll denn im Falle der Zeilen mit dem DoubleQuotes eigentlich herauskommen?
Wenn die Anführungszeichen zu dem Kundennamen gehören und der somit auch genau so in die Datenbank gehört wie er in der CSV steht, dann kannst du das ganz einfach lösen:
Delphi-Quellcode:
slRow.StrictDelimiter := true;
slRow.Delimiter := ';'; slRow.QuoteChar := #0; // übernimmt alle DoubleQuotes wie sie sind |
AW: DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes s
Zitat:
- wenn vorhanden stehen die Quotes immer am Anfang und am Ende des gesamten Feldinhalts - zwischen den Feldtrennzeichen und den Quotes gibt es keine weiteren Zeichen(auch keine Leerzeichen) - Quotes die zu Feldinhalt gehören(also Teil des übergebenen Textes sind) werden verdoppelt In diesem Sinn ist es ein spezielles CSV-Format mit Trennzeichen Semikolon, ohne Quotes. Siehe Uwe Raabe. |
AW: DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes s
@Uwe Raabe;
Delphi-Quellcode:
SUPER .. vielen Dank :-)
slRow.QuoteChar := #0;
|
AW: DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes s
Du mußt dann nur aufpassen, dass in den Feldern kein
Delphi-Quellcode:
vorkommt,
,
denn mit #0 werden Quotes komplett ignoriert und somit ist dann bei
Delphi-Quellcode:
das
a,"b,c",d
Delphi-Quellcode:
zwischen b und c auch ein Trennzeichen und kein "Text".
,
|
AW: DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes s
Auch, wenn man
Delphi-Quellcode:
angibt? (s. o.)
lRow.Delimiter := ';';
|
AW: DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes s
OK, dann eben bei
Delphi-Quellcode:
im Text, anstatt
;
Delphi-Quellcode:
... halt beim "Delimiter".
,
Delphi-Quellcode:
a;"b;c";d
Wird das "QuoteChar" nicht behandelt, dann kann damit auch kein Delimiter "escapet" werden. |
AW: DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes s
Ich kann erneut nur raten, eine Klasse für das Zerlegen der Zeilen zu erstellen, da es vermutlich zu immer weiteren Sonderfällen kommen wird. Und für jeden unterschiedlichen Fall einen Unittest zu erstellen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz