Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi CSV Datei in eine Tabelle auf SQL-Server laden (https://www.delphipraxis.net/33348-csv-datei-eine-tabelle-auf-sql-server-laden.html)

AndreT 5. Nov 2004 13:59


CSV Datei in eine Tabelle auf SQL-Server laden
 
Hallo zusammen

Ich muss Datensätze aus einem CSV-File in eine SQL-Server-Tabelle laden. Die Anzahl der Datensäte beträgt min 600000 Stück.
Sie kommen gesplittet in mehreren Files an. Diese Files kopiere ich automatisch der Reihe nach in eine "temp.csv" um. Auf dieser Datei habe ich eine ODBC-Connection liegen.

somit habe ich unter Dephi eine ADODataConnection1, ein AdoTable1, und eine DataSource1. und ich habe eine ADODataConnection2, ein AdoTable2, und eine DataSource2 die mir die Verbindung zur SQL-Server-Tabelle herstellt.

Wie bekomme ich jetzt die Daten aus der ersten Connection an die Tabelle der 2.Connection angehängt?

Ich steh da vor einem Rätsel :coder2: und wer Euch echt Dankbar, wenn mir jemand helfen könnte.

Ist mein Lösungsansatz überhaupt sinnvoll? oder gibt es eine Bessere Möglichkeit?

Danke

Gruss

PS: BDE kommt nicht in Frage.

trifid 5. Nov 2004 14:53

Re: CSV Datei in eine Tabelle auf SQL-Server laden
 
somit habe ich unter Dephi eine ADODataConnection1, ein AdoTable1, und eine DataSource1. und ich habe eine ADODataConnection2, ein AdoTable2, und eine DataSource2 die mir die Verbindung zur SQL-Server-Tabelle

a) beim SQL-Server würde ich das ADODataSet empfehlen
b) zum Code
Delphi-Quellcode:
while not AdoTable1.EOF do
begin
   AdoDataSet.Insert;
   AdoDataSet.FieldByName('Feld1').AsString := AdoTable.FieldByName('FeldA').AsString;
   AdoDataSet.FieldByName('Feld2').AsInteger := FunktionEinerKonvertierung(AdoTable.FieldByName('FeldB').AsString);
   AdoDataSet.Post;

   AdoTable1.Next;
end;
c) wenn deine CSV-Datei das Format der Tabellenstruktur hat, dann könntest du über BulkCopy bcp.exe gehen

shmia 5. Nov 2004 15:05

Re: CSV Datei in eine Tabelle auf SQL-Server laden
 
Zitat:

Zitat von AndreT
Ich muss Datensätze aus einem CSV-File in eine SQL-Server-Tabelle laden. Die Anzahl der Datensäte beträgt min 600000 Stück.
Sie kommen gesplittet in mehreren Files an. Diese Files kopiere ich automatisch der Reihe nach in eine "temp.csv" um. Auf dieser Datei habe ich eine ODBC-Connection liegen.

Das würde ich nicht tun.
Durch die Treiberschicht von ODBC hast du schon einen grossen Performanceverlust.
Ich würde jede Datei direkt in eine TStringList einlesen und dann Zeile für Zeile in die Einzelfelder zerlegen.
Siehe Code-Library: http://www.delphipraxis.net/internal...ct.php?t=29791
Zitat:

Zitat von AndreT
somit habe ich unter Dephi eine ADODataConnection1, ein AdoTable1, und eine DataSource1. und ich habe eine ADODataConnection2, ein AdoTable2, und eine DataSource2 die mir die Verbindung zur SQL-Server-Tabelle herstellt.

Ein ADOTable ist schlecht, da du ja nicht alle Datensätze vom Server abrufen, sondern nur einfügen willst.
Deshalb nimm eine ADOQuery mit den Eigenschaften:
Delphi-Quellcode:
CursorLocation := clUseClient;
SQL.Text := 'SELECT * FROM tabelle WHERE 0=1';
Hier noch ein Beispiel:
Delphi-Quellcode:
   liste := TStringList.Create;
   liste.LoadFromFile(fname);
   // leere Zeilen entfernen
   RemoveEmptyStrings(liste);

   ProgressBarImport.Max := liste.Count - 1;
   for n := 0 to liste.Count - 1 do
   begin
      ProgressBarImport.Position := n;
      Application.ProcessMessages;
      s := liste.Strings[n];

      ADOQuery1.Append;

      FBulkInsert.DataSet['KFZ'] := ExtractDelimited(1, s, delims);
      FBulkInsert.DataSet['PLZ'] := ExtractDelimited(2, s, delims);
      FBulkInsert.DataSet['EPL'] := ExtractDelimited(3, s, delims);
      FBulkInsert.DataSet['TOUR'] := ExtractDelimited(4, s, delims);
      FBulkInsert.DataSet['TIME_NORM'] := ExtractDelimited(5, s, delims);
      FBulkInsert.DataSet['TIME_FRUEH'] := ExtractDelimited(6, s, delims);
      ADOQuery1.Post;
   end;

AndreT 5. Nov 2004 15:05

Re: CSV Datei in eine Tabelle auf SQL-Server laden
 
Danke

Das CSV-File hat die gleiche Struktur wie die Tabelle der DB.

Wo finde ich diese bcp.exe? Ist das ein Dephi-Modul?


zu der Sache mit dem Eof, da hab ich Angst, das die Laufzeit bei der Menge Datensätze zu groß wird.

trifid 5. Nov 2004 15:12

Re: CSV Datei in eine Tabelle auf SQL-Server laden
 
die bcp.exe findest du unter dem SQL-Server-Verzeichnis
z.B. C:\Programme\Microsoft SQL Server\80\Tools\Binn

AndreT 8. Nov 2004 10:22

Re: CSV Datei in eine Tabelle auf SQL-Server laden
 
Ich habe gerade mal die EOF-Methode ausprobiert und bin zu dem Ergebnis gekommen, das ich für 90.000 Datensätze rund eine Halbe Stunde benötige. Das ist zu lange, wenn man bedenkt, das es sich bei mir um die 600.000 Datensätze drehen soll / muss.

trifid 8. Nov 2004 11:23

Re: CSV Datei in eine Tabelle auf SQL-Server laden
 
nun das sind 50 Datensätz pro Sekunde
Hast du irgendwelche Konvertierungsroutinen wie DateToStr oder Format im Code enthalten
Wird beim Einlesen für jeden Datensatz eine Selektion wird die Daten nachreferenziert
Werden die Daten einmalig eingespielt oder des öfteren
Baue eine Anwendung und führe diese direkt am Server aus, geht's schneller

AndreT 8. Nov 2004 12:20

Re: CSV Datei in eine Tabelle auf SQL-Server laden
 
Die Datensätze werden grundsätzlich erstmal nur einmalig eingelesen ohne das irgendwelche Abfragen drüber her laufen (bis jetzt).
Der Datenimport in dieser größe findet allerdings Monatlich statt.

Mein Augenblicklicher nächster Ansatz ist:
die Daten über ein DTS-Package rüberzuholen. Laufzeit 4,5 Sekunden.
Allerdings, da die Rohdaten in mehreren Files kommen, muss ich ein File umbenennen in die Datei auf die meine ODBC - Verbindung zeigt. Ist die Datei abgearbeitet, muss die nächste umbenannt und eingelesen werden.usw.

Allerdings bekomme ich momentan das DTS-Package über Delphi nicht angesprochen. Ich kann zwar als ADO-Connection den Provider für DTS-Packages auswählen, aber es nimmt keine der von mir eingegebenen Datenquellen an (zB \\SERVERXY\Package1 ).

gibt es da einen Trick? das Package liegt auf einem MS-SQL-Server in einem Netzwerk, also nicht hier bei mir Lokal. Rechte hab ich alle auf dem Server.

trifid 8. Nov 2004 12:52

Re: CSV Datei in eine Tabelle auf SQL-Server laden
 
der Datenexport beim SQL-Server funktioniert mit DTS
hier kannst Du auch ein VB-Script generieren lassen, wo du Anhaltspunkte für deine eigene Programmierung hast
BCP im Batch-Betrieb, schon ausprobiert ?

AndreT 11. Nov 2004 09:55

Re: CSV Datei in eine Tabelle auf SQL-Server laden
 
So, das ganze ist jetzt über ein DTS-Package gelöst, was von Delphi ausgelöst wird.

Jetzt muss nur noch irgendwo eine Rückmeldung erfasst werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:08 Uhr.
Seite 1 von 2  1 2      

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