![]() |
AW: csv Datei Import ClassHelper für TClientDataSet
Hallo,
es freut mich, das der Code jemanden helfen konnte. Ich hatte schon ganz vergessen, das ich das damals gemacht hatte. :stupid: Viele Grüße MaBuSE |
AW: csv Datei Import ClassHelper für TClientDataSet
Ja ... der ist sehr nützlich, auch wenn ich ihn immer noch nicht ganz verstehe :-D Trotzdem .... vielen Dank !!
Hans |
AW: csv Datei Import ClassHelper für TClientDataSet
Zitat:
Das kannst Du ganz einfach testen. Lege zwei TMemo und einen TButton auf dein TForm. Auf den TButton hinterlegst Du auf das OnClick Ereignis folgenden Text:
Delphi-Quellcode:
Damit wird jeweils eine Zeile mit dem kommaseparierten Werten an Memo2 hinzugefügt.
procedure TForm1.Button1Click(Sender: TObject);
begin Memo2.Lines.Add(Memo1.Lines.DelimitedText); end; Welche Auswirkungen die Parameter/Eigenschaften haben kann man leicht mit folgendem Quelltext testen:
Delphi-Quellcode:
Einfach noch 2 TEdit und eine TCheckBox auf das Form legen. Und mit den Werten spielen (Testen)
procedure TForm1.Button1Click(Sender: TObject);
begin Memo1.Lines.Delimiter := Edit1.Text[1]; // Default: , Memo1.Lines.QuoteChar := Edit2.Text[1]; // Default: " Memo1.Lines.StrictDelimiter := CheckBox1.Checked; // Default: False Memo2.Lines.Add(Memo1.Lines.DelimitedText); end; Dann ist relativ schnell klar wie der Mechanismus funktioniert. Das funktioniert natürlich auch in der anderen Richtung:
Delphi-Quellcode:
Memo1.Lines.DelimitedText := 'Eins,Zwei,Drei,"Vier","Fünf"';
Memo1 kann also eine Zeile der CSV Datenmenge darstellen (Ein Wert(Spalte) pro Zeile) Mit einem paar Klicks auf Button 1 wird schnell klar wie man eine ganze Datei verarbeiten kann. Man braucht nur ein 2. TStrings um die Liste abzulegen. (In unserem Beispiel Memo2.) Diese wird dann mit einem
Delphi-Quellcode:
zeilenweise verarbeitet.
for
Das ist alles. Die ganze Funktionalität der Umwandlung von/in das CSV Format ist schon im TStrings implementiert :thumb: Deswegen ist das so wenig Programieraufwand. Siehe auch Doku: ![]() Der
Delphi-Quellcode:
ist nur eine Einfache Methode die Prozedur an das TClientDataSet zu hängen, so dass es aussieht, als ob TClientDataSet das könnte. (ohne Vererbung)
class helper for TClientDataSet
Siehe auch Doku: ![]() Ich hoffe Du verstehst es nun besser. De |
AW: csv Datei Import ClassHelper für TClientDataSet
DANKE für die Erklärung - ich teste das morgen mal kurz aus :-)
Im Moment habe ich noch ein problemn wenn im Text ein Semikolon vorkommt - dann gibt es eine Exception. Also bei "das ist der;eigentliche Text Feld 1";"Feld 2";"Feld 3" da bringt das erste Semikolon reproduzierbar ne Exception. Gruß Hans |
AW: csv Datei Import ClassHelper für TClientDataSet
Auch mit QuoteChar="? Genau dafür ist das doch gedacht.
|
AW: csv Datei Import ClassHelper für TClientDataSet
Zitat:
Vorallem da dieses Zeichen wohl niemals in einer CSV vorkommen sollte. (und C-Programme / PChar kommen auch nicht mit #0 klar, drum kommt es so selten in Texten vor, da es ja ENDE bedeutet) 0 heißt eh so viel wie Nichts. Und "ersetzen" bedeutet jetzt doch hoffentlich auch "ich übergebe es beim Aufruf" und nicht "ich ändere den Code des Helpers" ? |
AW: csv Datei Import ClassHelper für TClientDataSet
Zitat:
Delphi-Quellcode:
Das bringt keine Exception. Es wird
procedure TForm1.Button1Click(Sender: TObject);
var sl : TStringList; begin sl := TStringList.Create; sl.QuoteChar := '"'; sl.Delimiter := ';'; sl.DelimitedText := '"das ist der;eigentliche Text Feld 1";"Feld 2";"Feld 3"'; Caption := sl[0]; end;
Delphi-Quellcode:
in das Caption des Formulars gesetzt. Und das ist richtig.
das ist der;eigentliche Text Feld 1
Es liegt also nicht an dem CSV Support der TStrings Klasse. |
AW: csv Datei Import ClassHelper für TClientDataSet
Zitat:
Was aber natürlich nicht heißt das irgend jemand wieder ein " in den nächsten Kundensatz einträgt. Hans |
AW: csv Datei Import ClassHelper für TClientDataSet
Zitat:
Delphi-Quellcode:
---------------------------
DisableControls;
for i := 0 to slFile.Count - 1 do begin slFile[i] := StringReplace(slFile[i], '"', '''', [rfReplaceAll, rfIgnoreCase]); slRow.DelimitedText := slFile[i]; Append; for j := 0 to slRow.Count -1 do begin Fields[j].AsString := slRow[j]; end; Post; end; EnableControls; finally slFile.Free; slRow.Free; end; Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Mahnung.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x00684abe: read of address 0x00000000' aufgetreten. --------------------------- Anhalten Fortsetzen Hilfe --------------------------- slRow[j] hat zu dem Zeitpunkt folgenden Inhalt: "12345";"1";"Müller-Meyer";"Müller-Meyer-Schulze GmbH";"";"Elbchaussee 1";"D";"22000";"Hamburg";"";"Frau";"Michaela";"Mül ler";"+49 (40) 123456-0";"+49 (40) 123456 111";"m.mueller@mueller-meyer.de";"1";"36";"rechnung@mueller-meyer.de; einkauf@mueller-meyer.de" Gruß Hans |
AW: csv Datei Import ClassHelper für TClientDataSet
Komischerweise ... mit diesem Source:
Delphi-Quellcode:
und dieser CSV klappt es:
procedure TForm1.FormCreate(Sender: TObject);
begin Memo1Fuellen; Memo2.Lines.Delimiter := ';'; Memo2.Lines.QuoteChar := '"'; Memo2.Lines.StrictDelimiter := false; Memo2.Lines.DelimitedText := Memo1.Lines[i]; end; "Test 5 - Hochkomma, ein Semikolon im Text ";"das ist der;eigentliche Text Feld 2";"Feld 3";"Feld 4" Hans *verwirrt* |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 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