Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   CSV Datei einlesen .. Return in CSV-Datei (https://www.delphipraxis.net/196873-csv-datei-einlesen-return-csv-datei.html)

erich.wanker 26. Jun 2018 17:52

CSV Datei einlesen .. Return in CSV-Datei
 
Hallo Leute,
ich will eine CSV Datei einlesen (in ein TMemo - altes ACCESS-Programm ist die Quelle) und importieren - aber es klappt nicht.

Jetzt habe ich den Fehler gefunden: Einige Felder vom Access sind Notizfelder, wo Zeilenumbrüche drinnen sind.

Dadurch sind die Zeilenumbrüche auch in der CSV Datei - und die versauen mir den Import!


Jetzt hab ich gedacht - lösche ich einfach alle Zeilenumbrüche .. funktioniert aber auch nicht .. (Listenindex überschreitet..)

Ich mach folgendes:

Delphi-Quellcode:
memo1.Text := StringReplace(memo1.Text, sLineBreak, '', [rfReplaceAll]);


              for i:=0 to memo1.Lines.Count-1 do
              begin
                try
                  SL:=TStringList.Create;
                  SL.Delimiter := ';';
                  SL.StrictDelimiter:=true;
                  SL.DelimitedText := memo1.Lines[i];



                  t0 := SL.Strings[0];
                  t1 := SL.Strings[1];
                  t2 := SL.Strings[2];
                  t3 := SL.Strings[3];
                  t4 := SL.Strings[4];
                  t5 := SL.Strings[5];
ect..

Hat jemand eine Idee was ich da machen kann?

LiGrü
Erich

Delphi.Narium 26. Jun 2018 18:00

AW: CSV Datei einlesen .. Return in CSV-Datei
 
Zeilenumbrüche beim Export entfernen und nicht beim Import.

Momentan müsste aus der gesamten CSV-Datei im Memo ein Einzeiler werden.

Wie ist WordWrap beim Memo eingestellt? True, dann macht es selbst "nach Belieben" eigene Zeilenumbrüche in die CSV-Datei.

mkinzler 26. Jun 2018 18:00

AW: CSV Datei einlesen .. Return in CSV-Datei
 
Zeilenumbrüche in Memos sind keine vollständigen SLineBreaks sondern nur #10. Diese müssen nur wenn ohne #13 gelöscht werden.

Schokohase 26. Jun 2018 19:36

AW: CSV Datei einlesen .. Return in CSV-Datei
 
Wie sehen denn diese Zeilen mit Zeilenumbruch konkret aus?
Code:
1,Name,"Feld mit Zeilen
umbruch",2
Sind also die Felder mit den Zeilenumbrüchen quoted?

Dann ist das Ermitteln der ganzen (Daten-)Zeilen sehr einfach.

Man liest Zeile für Zeile, bis man eine gerade Anzahl an Quote-Chars hat. Das ist dann die Daten-Zeile.

erich.wanker 28. Jun 2018 11:02

AW: CSV Datei einlesen .. Return in CSV-Datei
 
Danke für die Hilfe :-)


Die Zeilenumbrüche im Text sind #13#10 (lt. Asciiarmor)
Anführungszeichen " , die den Text umgeben habe ich keine
WordWrap ist false

..ich werde die Daten wohl oder übel manuell bereinigen :-(

LiGrü
Erich

EmWieMichael 28. Jun 2018 13:55

AW: CSV Datei einlesen .. Return in CSV-Datei
 
Lese die Daten doch einfach Block- bzw. Byteweise, zähle die Felder pro Datensatz mit (dann weißt Du, wann das Notizfeld kömmt) und lasse in den Notizfeldern die 13/10er zu.

Frickler 28. Jun 2018 14:03

AW: CSV Datei einlesen .. Return in CSV-Datei
 
Wie ich das mache:
Vor dem Export die Umbrüche ersetzen, z.B. durch \n oder <p>.
Nach dem Import dann wieder retour.

EmWieMichael 28. Jun 2018 14:26

AW: CSV Datei einlesen .. Return in CSV-Datei
 
Ich meine also ungefähr so (ungetestet, vermutlich nicht fehlerfrei):
Code:
var F:File of AnsiChar; Buf:Array [1..512] of AnsiChar; Col:Integer; S:String; C:AnsiChar;
...
  AssignFile(F, FileName);
  Reset(F);
  Col:=1;
  S:='';
  while (not EoF(F)) do
   begin
     BlockRead(F, Buf, 512, Count);
     P:=1;
     repeat
       C:=Buf[P];
       case C of
         #10 : if (Col = 5) then  // Notizfeld
                begin
                  Memo.Lines.Add(S);
                  S:='';
                end
               else
                begin // Satzende
                  Col:=1;
                  S:='';
                end;
         #13 : begin
               end;
         ';' : begin
                 Memo.Lines.Add(S);
                 Inc(Col);
                 S:='';
               end;
         else
          begin
            S:=S + C;
          end;
       end;
       Inc(P);
     until (P > Count);
   end;
  CloseFile(F);
...

p80286 28. Jun 2018 14:54

AW: CSV Datei einlesen .. Return in CSV-Datei
 
Wenn es sich wirklich um CSV handeln sollte, dann würde ich dem Absender ungequotete #13#10 zurückschicken.
Ich habe übrigens des öfteren Daten mit Partnern ausgetauscht, da spricht man über den Zeichensatz, die Feldtrenner, die Satztrenner , formuliert ein Papier dazu und gut ist.


Falls noch jemand was nachlesen möchte:
https://www.ietf.org/rfc/rfc4180.txt
https://ronaldduncan.wordpress.com/2...elimited-text/

gruß
K-H


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