Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes sind (https://www.delphipraxis.net/209751-delimitedtext-tstrings-problem-doublequotes-wenn-sie-am-anfang-eines-wertes-sind.html)

erich.wanker 17. Jan 2022 14:28

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;

erich.wanker 17. Jan 2022 15:06

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?

Union 17. Jan 2022 15:11

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.

Uwe Raabe 17. Jan 2022 15:20

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

Blup 17. Jan 2022 15:42

AW: DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes s
 
Zitat:

Zitat von erich.wanker (Beitrag 1500736)
Vorweg: "Double quotes as a string encapsulator is a feature of the CSV specifications"

Der Satz ist zwar richtig, aber da gehört noch ein bischen mehr dazu.
- 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.

erich.wanker 18. Jan 2022 15:02

AW: DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes s
 
@Uwe Raabe;

Delphi-Quellcode:
slRow.QuoteChar := #0;
SUPER .. vielen Dank :-)

himitsu 18. Jan 2022 16:13

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:
a,"b,c",d
das
Delphi-Quellcode:
,
zwischen b und c auch ein Trennzeichen und kein "Text".

Delphi.Narium 18. Jan 2022 16:25

AW: DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes s
 
Auch, wenn man
Delphi-Quellcode:
lRow.Delimiter := ';';
angibt? (s. o.)

himitsu 18. Jan 2022 16:27

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.

Union 18. Jan 2022 19:43

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:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz