Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi CSV mit Zeilenumbrüchen imprortieren (https://www.delphipraxis.net/106885-csv-mit-zeilenumbruechen-imprortieren.html)

Overburn 18. Jan 2008 08:20

Datenbank: MSSQL • Version: 2005 • Zugriff über: lokal

CSV mit Zeilenumbrüchen imprortieren
 
Moin mitdelphianer,

ich bräuchte mal bitte eure Mithilfe bei einem Ansatz.
Ich hab die Aufgabe eine seeehr große CSV-Datei mittels Delphiprogramm in eine Datenbank zu importieren.
Soweit kein großes Ding.
Jetzt ist aber die Sache, dass es in der Urspurngsdatenbank (auf die ich NICHT zugreifen kann) Felder gab, in denen Zeilenumbrüche erlaubt waren. Das hat beim Export die ganze CSV-Datei kaputt gemacht. Soll heißen, immer wenn ein Zeilenumbruch in einem Feld stand, gab es einen Zeilenumbruch in der CSV. Ich müsste jetzt diese Zeilenumbrüche aus der Datei entfernen. Leider müssen die Umrbrüche erhalten bleiben. Meine Idee wäre die #13#10 durch #10 zu ersetzen.
Ich hab jetzut überlegt jede Zeile einzeln nach den Umbrüchen zu durchsuchen und diese zu ersetzen. Nur kann es da passieren, dass ich echten Ende der Zeile/des Datensatzes ankomme und auch diese Zeilenumbruch wegfiltere.

Was sagt ihr zu meinem Ansatz?

Gruß,
Stefan

shmia 18. Jan 2008 08:42

Re: CSV mit Zeilenumbrüchen imprortieren
 
* Daten auf eine TStringList einlesen
* Zeile für Zeile durchgehen und die Anzahl der Trennzeichen ( ; ) zählen
* sollte eine Zeile zu wenig Trennzeichen haben, die aktuelle mit der folgenden Zeile verschmelzen
* StringList speichern

marabu 18. Jan 2008 09:21

Re: CSV mit Zeilenumbrüchen imprortieren
 
Hallo,

oft zeichnen sich CSV-Formate mit Zeilenumbrüchen in den Feldwerten dadurch aus, dass alle Feldwerte mit Begrenzungszeichen geschrieben werden. In diesen Fällen kann man die Prüfung noch vereinfachen:

Delphi-Quellcode:
var
  i: Integer;
  sLine, sBuffer: string;
  cQuote: Char;
begin
  AssignFile(input, '');
  Reset(input);
  AssignFile(output, '');
  Rewrite(output);
  sBuffer := '';
  cQuote := '"';
  while not Eof do
  begin
    ReadLn(sLine);
    sBuffer := sBuffer + sLine;
    if (RightStr(sBuffer, 1) = cQuote) and (RightStr(sBuffer, 2) <> cQuote + cQuote) then
    begin
      WriteLn(sBuffer);
      sBuffer := '';
    end;
  end;
  CloseFile(output);
  CloseFile(input);
end;
Getippt und nicht getestet.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 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