Delphi-PRAXiS
Seite 2 von 7     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi csv Datei Import ClassHelper für TClientDataSet (https://www.delphipraxis.net/164041-csv-datei-import-classhelper-fuer-tclientdataset.html)

MaBuSE 7. Jun 2017 15:54

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

H.Bothur 7. Jun 2017 20:50

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

MaBuSE 8. Jun 2017 09:51

AW: csv Datei Import ClassHelper für TClientDataSet
 
Zitat:

Zitat von H.Bothur (Beitrag 1373777)
..., auch wenn ich ihn immer noch nicht ganz verstehe :-D ....

Die Funktionalität ist quasi Bestandteil des TStrings Objekts ;-)

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:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo2.Lines.Add(Memo1.Lines.DelimitedText);
end;
Damit wird jeweils eine Zeile mit dem kommaseparierten Werten an Memo2 hinzugefügt.

Welche Auswirkungen die Parameter/Eigenschaften haben kann man leicht mit folgendem Quelltext testen:
Delphi-Quellcode:
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;
Einfach noch 2 TEdit und eine TCheckBox auf das Form legen. Und mit den Werten spielen (Testen)

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:
for
zeilenweise verarbeitet.

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: http://docwiki.embarcadero.com/Libra....DelimitedText

Der
Delphi-Quellcode:
class helper for TClientDataSet
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)
Siehe auch Doku: http://docwiki.embarcadero.com/RADSt...ecords_(Delphi)

Ich hoffe Du verstehst es nun besser.
De

H.Bothur 8. Jun 2017 16:23

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

Jumpy 9. Jun 2017 08:25

AW: csv Datei Import ClassHelper für TClientDataSet
 
Auch mit QuoteChar="? Genau dafür ist das doch gedacht.

himitsu 9. Jun 2017 09:29

AW: csv Datei Import ClassHelper für TClientDataSet
 
Zitat:

Zitat von H.Bothur (Beitrag 1373736)
Nicht ganz sauber - aber ich ersetzte jetzt das " durch ein ' :-)

Wie wäre es mit #0 ?

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" ?

MaBuSE 9. Jun 2017 09:35

AW: csv Datei Import ClassHelper für TClientDataSet
 
Zitat:

Zitat von H.Bothur (Beitrag 1373895)
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.

Um das Problem analysieren zu können benötige ich mehr Informationen:
  • Welche Exception?
  • An welcher Stelle tritt die auf?
  • Stack?
Ich hab das mal kurz angetestet:
Delphi-Quellcode:
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;
Das bringt keine Exception. Es wird
Delphi-Quellcode:
das ist der;eigentliche Text Feld 1
in das Caption des Formulars gesetzt. Und das ist richtig.
Es liegt also nicht an dem CSV Support der TStrings Klasse.

H.Bothur 9. Jun 2017 11:22

AW: csv Datei Import ClassHelper für TClientDataSet
 
Zitat:

Zitat von himitsu (Beitrag 1373968)
Zitat:

Zitat von H.Bothur (Beitrag 1373736)
Nicht ganz sauber - aber ich ersetzte jetzt das " durch ein ' :-)

Und "ersetzen" bedeutet jetzt doch hoffentlich auch "ich übergebe es beim Aufruf" und nicht "ich ändere den Code des Helpers" ?

Nein - viel besser - ich habs in der Kundendatenbank ersetzt, also in der CSV-Datei :-)
Was aber natürlich nicht heißt das irgend jemand wieder ein " in den nächsten Kundensatz einträgt.

Hans

H.Bothur 9. Jun 2017 11:36

AW: csv Datei Import ClassHelper für TClientDataSet
 
Zitat:

Zitat von MaBuSE (Beitrag 1373969)
Zitat:

Zitat von H.Bothur (Beitrag 1373895)
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.

Um das Problem analysieren zu können benötige ich mehr Informationen:
  • Welche Exception?
  • An welcher Stelle tritt die auf?
  • Stack?

Das passiert an der Stelle Fields[j].AsString := slRow[j];

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

H.Bothur 9. Jun 2017 12:01

AW: csv Datei Import ClassHelper für TClientDataSet
 
Komischerweise ... mit diesem Source:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1Fuellen;
  Memo2.Lines.Delimiter := ';';
  Memo2.Lines.QuoteChar := '"';
  Memo2.Lines.StrictDelimiter := false;
  Memo2.Lines.DelimitedText := Memo1.Lines[i];
end;
und dieser CSV klappt es:

"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 12:36 Uhr.
Seite 2 von 7     12 34     Letzte »    

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