![]() |
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 |
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. |
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.
|
AW: CSV Datei einlesen .. Return in CSV-Datei
Wie sehen denn diese Zeilen mit Zeilenumbruch konkret aus?
Code:
Sind also die Felder mit den Zeilenumbrüchen quoted?
1,Name,"Feld mit Zeilen
umbruch",2 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. |
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 |
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.
|
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. |
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); ... |
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: ![]() ![]() gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 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