Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   CVS-Import FireDAC (https://www.delphipraxis.net/204700-cvs-import-firedac.html)

Ghostwalker 20. Jun 2020 06:35

Datenbank: SQLite • Version: 3.24 • Zugriff über: FireDAC

CVS-Import FireDAC
 
Hallo und guten Morgen :)

Folgende Problematik:

Ich importiere CVS-Dateien via TFDBatchMove in ein TFDMemtable und zeige das ganze erstmal in einem TDBGrid an. Soweit so gut, funktioniert auch.

ABER:

Die CVS-Dateien enthalten in der ersten Zeile die Namen der Spalten (bzw. dessen Bedeutung). Leider hab ich es bisher (nach 2 Tagen) nicht geschaft,
dem TFDBatchMove beizubringen, das er die erste Zeile (bzw. dessen Einträge) als Feldnamen zu nutzen. Er nutzt immer das Format "FDMemFieldXXX". Das ist natürlich etwas
ungünstig, wenn man unterschiedliche CSV-Dateien hat, bei denen zwar die Bedeutung der Spalten (je nach Name) gleich ist, sie aber unterschiedliche Anzahlen von Spalten haben
(insbesondere wenn man die Daten schließlich in eine DB überträgt).

Deshalb:

Gibt es eine Lösung, wie ich dem TFDBatchmove beibringen kann, die 1. Zeile der CSV-Datei nicht als normale Datenzeile, sonder als "Definitions-Zeile" zu interpretieren ?

mensch72 20. Jun 2020 07:15

AW: CVS-Import FireDAC
 
..."Leider hab ich es bisher (nach 2 Tagen) nicht geschaft"...
=> 1min google "TFDBatchMove":
http://docwiki.embarcadero.com/CodeE...tchMove_Sample

...
Sets the FileName property of TFDBatchMoveTextReader with the location of data.txt. This is the file used to load the data to the table. Also several DataDef properties are adjusted according to the text file format.
DataDef.Separator := ','; It defines the separator used to separate the fields in the text file.
DataDef.WithFieldNames := True; It specifies that the field name is included in the first row of the text file.
...

Ghostwalker 20. Jun 2020 15:25

AW: CVS-Import FireDAC
 
Tja..das hatte ich schon probiert. Leider hats nicht funktioniert.

Uwe Raabe 20. Jun 2020 15:59

AW: CVS-Import FireDAC
 
Deine Frage
Zitat:

Zitat von Ghostwalker (Beitrag 1467832)
Gibt es eine Lösung, wie ich dem TFDBatchmove beibringen kann, die 1. Zeile der CSV-Datei nicht als normale Datenzeile, sonder als "Definitions-Zeile" zu interpretieren ?

ist mit diesem Hinweis eigentlich beantwortet:
Zitat:

Zitat von mensch72 (Beitrag 1467833)
DataDef.WithFieldNames := True; It specifies that the field name is included in the first row of the text file.

Wenn das bei dir nicht funktioniert, machst du vielleicht was falsch. Was das ist, können wir aber nicht sehen.

Ghostwalker 20. Jun 2020 16:10

AW: CVS-Import FireDAC
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habs grad auf die ganz einfach Tour noch mal Probiert (sicher ist sicher).

neue VCL anwendung
TFDBatchMoveTextReader drauf.
Optionen -> eingestellt.
FileName auf die Datei eingestellt.
TFDBatchMoveDataSetWrite drauf,TFDMemTable drauf beides miteinander verknüpft.
TFDBatchMove drauf, reader und writer gesetzt
TDBDatasource drauf -> mit dem MemTable verknüpft.
TDBGrid drauf mit dem DataSource verknüpft.


Anschließend in der IDE auf Guess Format und schließliche Execute im BatchMove ausgeführt.

Ergebniss siehe Anhang.

Kleiner Schnipsel der CSV-Datei, die es zu importieren gilt.

Code:
"alpha3-b","alpha3-t","alpha2","English","French"
"aar","","aa","Afar","afar"
"abk","","ab","Abkhazian","abkhaze"
"ace","","","Achinese","aceh"
"ach","","","Acoli","acoli"
"ada","","","Adangme","adangme"
"ady","","","Adyghe; Adygei","adyghé"
"afa","","","Afro-Asiatic languages","afro-asiatiques, langues"
"afh","","","Afrihili","afrihili"
"afr","","af","Afrikaans","afrikaans"
"ain","","","Ainu","aïnou"
"aka","","ak","Akan","akan"
"akk","","","Akkadian","akkadien"
"alb","sqi","sq","Albanian","albanais"
"ale","","","Aleut","aléoute"
"alg","","","Algonquian languages","algonquines, langues"
"alt","","","Southern Altai","altai du Sud"
"amh","","am","Amharic","amharique"
"ang","","","English, Old (ca.450-1100)","anglo-saxon (ca.450-1100)"
"anp","","","Angika","angika"
"apa","","","Apache languages","apaches, langues"
"ara","","ar","Arabic","arabe"
"arc","","","Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE)","araméen d'empire (700-300 BCE)"
"arg","","an","Aragonese","aragonais"
"arm","hye","hy","Armenian","arménien"
"arn","","","Mapudungun; Mapuche","mapudungun; mapuche; mapuce"
"arp","","","Arapaho","arapaho"
"art","","","Artificial languages","artificielles, langues"
"arw","","","Arawak","arawak"
"asm","","as","Assamese","assamais"

juergen 20. Jun 2020 17:01

AW: CVS-Import FireDAC
 
Hallo,

da ich es in deinem Code-Ausschnitt nicht sehe. Hast du denn wie schon vorgeschlagen:

Delphi-Quellcode:
TFDBatchMoveTextReader.DataDef.WithFieldNames := True;
auch gesetzt?

Ghostwalker 20. Jun 2020 17:20

AW: CVS-Import FireDAC
 
Bitte die Posts erstmal lesen.

Ghostwalker 21. Jun 2020 06:27

AW: CVS-Import FireDAC
 
Guten Morgen :)

Nach weiteren Analysen (böse Zungen würden sagen "Rumprobierei" :) ) hab ich zwar die Ursache des Problems nicht gefunden, aber lustigerweise eine Lösung.

Bisher:

Code:
    Reader.FileName := fod.FileName;
    bm.GuessFormat();
    bm.Execute;
Jetzt:
Code:

    Reader.FileName := fod.FileName;
    bm.GuessFormat();
    PrepareFieldNames(HeadLine);
    UpdateReaderFieldnames;
    bm.Analyze := [];
    bm.Execute;
PrepareFieldNames mach nix anderes, als die 1. Zeile vom CSV selbst zu analysieren und die Feldnamen in einer Stringliste bereit zu stellen.
UpdateReaderFieldNames setzt nun die entsprechenden Feldname in der Definition des Readers manuell.
Danach noch die automatische Analyze (lt.Doku werden die Einstellungen hier nur im Execute verwendet) abgeschalten und schon gehts.

Wie gesagt, die genaue Ursache des Problems ist unbekannt. Sie liegt aber wohl im Umfeld der automatischen Analyse des Formats. Evtl. ist es auch "nur" ein Problem der
Community-Version.

Danke trotzdem für euere Mühen :)

matthias25881 6. Okt 2020 22:16

AW: CVS-Import FireDAC
 
Hallo, ich bin noch anfänger in der Delphi DB geschichte.
Ich bin dabei ein einfaches program zu erstellen das eine csv datei einliest und in eine mysql datenbank schreibt.
Soweit funktioniert es auch.
Jetzt kommen aber meine probleme.
Ich gehe den weg über ein dbgrid und dann nach mysql.
meine CSV hat 5 columns und ca. 26000 Row.
jetzt möchte ich nicht alle Spalten importieren, sondern nur 2,4 und 5.
Wie kann ich das den bewerkstelligen??
Dann möchte ich noch ein Textfeld in das ich eine zahl schreibe und die dann in eine Spalte der Mysql db geschrieben wird (von zeile 1 bis 26000).

Wäre cool wenn mir einer tips geben könnte wie ich das machen kann.

Danke.

himitsu 6. Okt 2020 23:28

AW: CVS-Import FireDAC
 
Wozu erst umständlich in ein DBGrid, anstatt direkt in ein DataSet/Query?

Naja, die CSV direkt in die Datenbank ist wohl das Bekannteste und sehr einfach.
Und dann nur noch ein INSERT/UPDATE+SELECT, um die Daten aus der Import-Tabelle in die Ziel-Tabelle zu kopieren, wo man nach Herzenslust auch Spalten weglassen oder weitere Spalten hinzufügen kann.
https://www.thewebhatesme.com/entwic...l-importieren/
https://www.mysqltutorial.org/import...e-mysql-table/

Oder eben über FireDAC-BatchMove (TFDBatchMove)
http://docwiki.embarcadero.com/CodeE...tchMove_Sample
http://codeverge.com/embarcadero.del...table1/1089699
https://stackoverflow.com/questions/...-a-fdtabletask


Ansonsten ein Query mit
Delphi-Quellcode:
SELCET A, B, C FROM table
und über DataSet.Insert, DataSet.Fields/FieldByName und DataSet.Post die Daten in die Datenbank übergeben.

Oder ein INSERT-Statement und dort ebenfalls mit DataSet.Params/ParamByName die Daten rein.


Die CSV, kann man mit einer speziellen CSV-Komponente lesen
oder einfach TStringList und jede Zeile über eine Split-Function (oder eine weitere TStringList mit StringList.DelimitedText) die einzelne Spalten zerlegen
und das dann ans DataSet/Query übergeben.

matthias250881 7. Okt 2020 06:13

AW: CVS-Import FireDAC
 
Danke für Info.
ich versteh davon nur Bahnhof.
könntest du mir ein Beispiel code geben??
Ich habe fireDAC batchmove in meinem vorhandenen code.

ich poste heute Abend wenn ich daheim bin mal code...




Zitat:

Zitat von himitsu (Beitrag 1474983)
Wozu erst umständlich in ein DBGrid, anstatt direkt in ein DataSet/Query?

Naja, die CSV direkt in die Datenbank ist wohl das Bekannteste und sehr einfach.
Und dann nur noch ein INSERT/UPDATE+SELECT, um die Daten aus der Import-Tabelle in die Ziel-Tabelle zu kopieren, wo man nach Herzenslust auch Spalten weglassen oder weitere Spalten hinzufügen kann.
https://www.thewebhatesme.com/entwic...l-importieren/
https://www.mysqltutorial.org/import...e-mysql-table/

Oder eben über FireDAC-BatchMove (TFDBatchMove)
http://docwiki.embarcadero.com/CodeE...tchMove_Sample
http://codeverge.com/embarcadero.del...table1/1089699
https://stackoverflow.com/questions/...-a-fdtabletask


Ansonsten ein Query mit
Delphi-Quellcode:
SELCET A, B, C FROM table
und über DataSet.Insert, DataSet.Fields/FieldByName und DataSet.Post die Daten in die Datenbank übergeben.

Oder ein INSERT-Statement und dort ebenfalls mit DataSet.Params/ParamByName die Daten rein.


Die CSV, kann man mit einer speziellen CSV-Komponente lesen
oder einfach TStringList und jede Zeile über eine Split-Function (oder eine weitere TStringList mit StringList.DelimitedText) die einzelne Spalten zerlegen
und das dann ans DataSet/Query übergeben.


haentschman 7. Okt 2020 06:44

AW: CVS-Import FireDAC
 
Moin...:P
Zitat:

Oder eben über FireDAC-BatchMove (TFDBatchMove)
...eine Komponente auf die Form klatschen hat nichts mit lernen zu tun. :kotz:
Zitat:

TStringList und jede Zeile über eine Split-Function (oder eine weitere TStringList mit StringList.DelimitedText) die einzelne Spalten zerlegen
und das dann ans DataSet/Query übergeben.
...das schon eher. :thumb:

Informationen:
Stringlist: http://docwiki.embarcadero.com/Libra...es.TStringList
DelimitedText: http://docwiki.embarcadero.com/Libra....DelimitedText
oder Split: http://docwiki.embarcadero.com/Libra...ngHelper.Split

Beispielcode: :stupid:

1. CSV von Platte in die StringList laden (gibt es eine Methode dafür TStringlist)
2. Stringlist durchlaufen
3. jede Zeile entweder splitten oder als DelimitedText in eine 2. Stringlist einlesen (dann hast du jedes Feld einzeln der Zeile)
4. SQL absetzen mit den Werten (! SQL Parameter https://www.delphipraxis.net/152692-...uebergabe.html)
5. ...fertsch 8-)

Zitat:

ich versteh davon nur Bahnhof.
"übersetze" mal den "Beispielcode" in echten und stelle das hier ein. Dann sehen wir weiter.

himitsu 7. Okt 2020 08:42

AW: CVS-Import FireDAC
 
Tipp: StrictDelimiter nicht vergessen, sonst reagiert die StringList beim Zerlegen etwas "übereifrig",
aber das wurde ja eigentlich auch in der OH erwähnt. (ganz unten und da wir wissen, dass niemand die Hilfe liest, vor allem nicht bis zum Schluss)

Delphi-Quellcode:
SL.Delimiter := ','; // oder ; oder womit sonst die Werte in deiner CSV getrennt sind
SL.StrictDelimiter := True; // denn sonst wird als "Delimiter" auch das Leerzeichen und Tabulatoren benutzt.
//SL.QuoteChar := '"'; // ändern, falls es kein " ist, wie z.B. '
SL.DelimitedText := DieZeile;
SL.Lines[i] {oder} SL[i]  // wie man auf die einzelnen -Zeilen- Spalten dann zugreift, sollte aber schon bekannt gewesen sein

PS: für jede einzelne Anzwort neu anmelden ist etwas übertrieben.
Im Notfall gibt es auch einen "Kennwort vergessen?"-Link.

matthias25881 7. Okt 2020 16:45

AW: CVS-Import FireDAC
 
Hallo,
ich komm da irgendwie nicht draus... liegt vielleicht weil ich nur hobby bastler bin....

hier mal mein code.

procedure TForm1.Button1Click(Sender: TObject);
begin
if opendialog1.Execute then
if opendialog1.FileName <> null then
begin
textreader1.FileName := opendialog1.FileName;
try
importfromcsv.Execute;
fdquery1.Close;
fdquery1.Open;
except
on E : Exception Do
ShowMessage(E.Message);
end;

end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
application.Terminate;
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
fdconnection1.Connected := false;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
fdconnection1.Connected := true;
fdquery1.Open;
end;

end.


Über datagrid bin ich nur gegangen weil ich ich mich nicht auskenne und da ein tut im internet gefunden habe....

Grüsse




Zitat:

Zitat von haentschman (Beitrag 1474987)
Moin...:P
Zitat:

Oder eben über FireDAC-BatchMove (TFDBatchMove)
...eine Komponente auf die Form klatschen hat nichts mit lernen zu tun. :kotz:
Zitat:

TStringList und jede Zeile über eine Split-Function (oder eine weitere TStringList mit StringList.DelimitedText) die einzelne Spalten zerlegen
und das dann ans DataSet/Query übergeben.
...das schon eher. :thumb:

Informationen:
Stringlist: http://docwiki.embarcadero.com/Libra...es.TStringList
DelimitedText: http://docwiki.embarcadero.com/Libra....DelimitedText
oder Split: http://docwiki.embarcadero.com/Libra...ngHelper.Split

Beispielcode: :stupid:

1. CSV von Platte in die StringList laden (gibt es eine Methode dafür TStringlist)
2. Stringlist durchlaufen
3. jede Zeile entweder splitten oder als DelimitedText in eine 2. Stringlist einlesen (dann hast du jedes Feld einzeln der Zeile)
4. SQL absetzen mit den Werten (! SQL Parameter https://www.delphipraxis.net/152692-...uebergabe.html)
5. ...fertsch 8-)

Zitat:

ich versteh davon nur Bahnhof.
"übersetze" mal den "Beispielcode" in echten und stelle das hier ein. Dann sehen wir weiter.


matthias25881 7. Okt 2020 21:34

AW: CVS-Import FireDAC
 
Hallo,
bin jetzt etwas weiter...
Bin jetzt am anderen Weg probieren.

Habe jetzt eine Form, ein FDconnection und FDquery.
In das SQL des Query habe ich das von hier (https://www.thewebhatesme.com/entwic...l-importieren/ ) etwas abgeändert geschrieben. Vom grund aus funktioniert es.

Wie kann ich denn einzelne Query machen.
Das wenn ich Button drücke


LOAD DATA LOCAL INFILE 'c:/test.csv' --> LoadfromFile
INTO TABLE tbldruck
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(@dummy, zeit, @dummy, druck, temp)

SET projekt_n = 101110, leitung = 'Kälte' ---> projekt_n und leitung aus Textedit gelsen wird

und dann in DB geschrieben wird.

Vielleicht könnt ihr mir noch paar tips geben...

danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:31 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