AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi csv Datei Import ClassHelper für TClientDataSet

csv Datei Import ClassHelper für TClientDataSet

Ein Thema von MaBuSE · begonnen am 26. Okt 2011 · letzter Beitrag vom 24. Mai 2019
Antwort Antwort
Seite 2 von 7     12 34     Letzte » 
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.812 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: csv Datei Import ClassHelper für TClientDataSet

  Alt 7. Jun 2017, 15:54
Hallo,
es freut mich, das der Code jemanden helfen konnte.
Ich hatte schon ganz vergessen, das ich das damals gemacht hatte.
Viele Grüße
MaBuSE
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
132 Beiträge
 
#12

AW: csv Datei Import ClassHelper für TClientDataSet

  Alt 7. Jun 2017, 20:50
Ja ... der ist sehr nützlich, auch wenn ich ihn immer noch nicht ganz verstehe Trotzdem .... vielen Dank !!

Hans
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.812 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: csv Datei Import ClassHelper für TClientDataSet

  Alt 8. Jun 2017, 09:51
..., auch wenn ich ihn immer noch nicht ganz verstehe ....
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:
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 for zeilenweise verarbeitet.

Das ist alles.

Die ganze Funktionalität der Umwandlung von/in das CSV Format ist schon im TStrings implementiert

Deswegen ist das so wenig Programieraufwand.

Siehe auch Doku: http://docwiki.embarcadero.com/Libra....DelimitedText

Der 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
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
132 Beiträge
 
#14

AW: csv Datei Import ClassHelper für TClientDataSet

  Alt 8. Jun 2017, 16:23
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
  Mit Zitat antworten Zitat
Jumpy
Online

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.554 Beiträge
 
Delphi 6 Enterprise
 
#15

AW: csv Datei Import ClassHelper für TClientDataSet

  Alt 9. Jun 2017, 08:25
Auch mit QuoteChar="? Genau dafür ist das doch gedacht.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#16

AW: csv Datei Import ClassHelper für TClientDataSet

  Alt 9. Jun 2017, 09:29
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" ?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 9. Jun 2017 um 09:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.812 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

AW: csv Datei Import ClassHelper für TClientDataSet

  Alt 9. Jun 2017, 09:35
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 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.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
132 Beiträge
 
#18

AW: csv Datei Import ClassHelper für TClientDataSet

  Alt 9. Jun 2017, 11:22
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
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
132 Beiträge
 
#19

AW: csv Datei Import ClassHelper für TClientDataSet

  Alt 9. Jun 2017, 11:36
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
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
132 Beiträge
 
#20

AW: csv Datei Import ClassHelper für TClientDataSet

  Alt 9. Jun 2017, 12:01
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*
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf