AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes sind

DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes sind

Ein Thema von erich.wanker · begonnen am 17. Jan 2022 · letzter Beitrag vom 18. Jan 2022
Antwort Antwort
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
453 Beiträge
 
Delphi XE4 Professional
 
#1

DelimitedText in Tstrings: Problem DoubleQuotes wenn sie am Anfang eines Wertes sind

  Alt 17. Jan 2022, 14:28
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 - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
453 Beiträge
 
Delphi XE4 Professional
 
#2

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

  Alt 17. Jan 2022, 15:06
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?
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#3

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

  Alt 17. Jan 2022, 15:11
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.973 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 17. Jan 2022, 15:20
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
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 17. Jan 2022, 15:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
453 Beiträge
 
Delphi XE4 Professional
 
#6

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

  Alt 18. Jan 2022, 15:02
@Uwe Raabe;

slRow.QuoteChar := #0; SUPER .. vielen Dank
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.076 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 18. Jan 2022, 16:13
Du mußt dann nur aufpassen, dass in den Feldern kein , vorkommt,
denn mit #0 werden Quotes komplett ignoriert und somit ist dann bei a,"b,c",d das , zwischen b und c auch ein Trennzeichen und kein "Text".
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.414 Beiträge
 
Delphi 7 Professional
 
#8

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

  Alt 18. Jan 2022, 16:25
Auch, wenn man lRow.Delimiter := ';'; angibt? (s. o.)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.076 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 18. Jan 2022, 16:27
OK, dann eben bei ; im Text, anstatt , ... halt beim "Delimiter".

a;"b;c";d
Wird das "QuoteChar" nicht behandelt, dann kann damit auch kein Delimiter "escapet" werden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (18. Jan 2022 um 16:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#10

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

  Alt 18. Jan 2022, 19:43
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:31 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