AW: CSV-Datei mit /sb
Bei einem ähnlichem Fall lese ich die Fremddatei zuerst mit einem StringStream ein.
Der 'Roh-String' wird bearbeitet und kann dann der StringList übergeben werden.
Delphi-Quellcode:
Gruß
ASL := TStringList.Create;
try StrStream := TStringStream.Create; try {.. hier reparieren wir die CRCRLF Orgie aus dem Textfile ..} StrStream.LoadFromFile(AFileName); RawSWData := StrStream.DataString; RawSWData := StringReplace(RawSWData,#13#13#10,'',[rfReplaceAll]); ASL.Text := RawSWData; //mit ASL arbeiten finally StrStream.Free; end; finally ASL.Free; end; Ralf |
AW: CSV-Datei mit /sb
Hallo zusammen,
bis jetzt hatte ich das auch immer so gemacht wie Uwe es gezeigt hat. Dafür habe ich mir die original System.Classes.pas in den entsprechenden Projektordner kopiert und diese Unit dann angepasst. Nachteil: Wenn ich mal eine neuere Delphiversionen einsetzen sollte, muss ich ggf. die System.Classes neu kopieren und bearbeiten. Von daher gefällt mir der Ansatz von Ralf ganz gut. Vorsichtshalber möchte ich nachfragen ob meine Deklaration von RawSWData so richtig ist (als string)?
Delphi-Quellcode:
RawSWData: string;
Vielen Dank! |
AW: CSV-Datei mit /sb
Zitat:
Delphi-Quellcode:
im Projekt so verhalten. Eventuell muss man ja auch unterschiedliche CSV-Dateien mit anderen abstrusen Konventionen einlesen können. Für den konkreten Anwendungsfall hatte ich mir eher etwas wie dieses vorgestellt:
TStringList
Delphi-Quellcode:
type
TSoftBreakStringList = class(TStringList) protected procedure SetTextStr(const Value: string); override; end; procedure TSoftBreakStringList.SetTextStr(const Value: string); var P, Start: PChar; S: string; begin if CompareStr(LineBreak, sLineBreak) <> 0 then begin inherited; Exit; end; BeginUpdate; try Clear; P := Pointer(Value); if P <> nil then begin while P^ <> #0 do begin Start := P; while not (P^ in [#0, #13]) do Inc(P); SetString(S, Start, P - Start); Add(S); if P^ = #13 then Inc(P); if P^ = #10 then Inc(P); end; end; finally EndUpdate; end; end; |
AW: CSV-Datei mit /sb
@Uwe,
das hatte ich mir schon gedacht dass du das nicht so machst wie ich. Ich wusste es halt nicht besser. Danke für dein Beispiel, somit habe ich wieder was gelernt! :dp: Gute N8! |
AW: CSV-Datei mit /sb
Zitat:
ja, das ist bei mir als String deklariert. Gruß Ralf |
AW: CSV-Datei mit /sb
@Ralf,
danke für deine Antwort! :thumb: Gruß Jürgen |
AW: CSV-Datei mit /sb
Zitat:
|
AW: CSV-Datei mit /sb
Zitat:
Wenn ich mich nicht täusche, werden nur die #10 übergangen, die nach einem #13 kommen. Alle anderen werden mit SetString in S übertragen. |
AW: CSV-Datei mit /sb
Ich hatte den Code wohl an einer Stelle falsch verstanden und hatte es aber auch zusätzlich probiert.
Zum Test hatte ich dann memo1.lines.text = stringlist.text probiert und gesehen, dass kein Zeilenumbruch im TMemo stattfand, daher ging ich davon aus, dass die #10 Zeichen entfallen wären. Aber jetzt den Code noch mal genauer angesehen und nein, die #10 werden nicht überlesen. Das TMemo verhält sich interessanterweise genau so wie Notepad, wenn man den Text so zuweist, wie oben von mir dargestellt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:02 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