AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi CSV Datei in eine Tabelle auf SQL-Server laden
Thema durchsuchen
Ansicht
Themen-Optionen

CSV Datei in eine Tabelle auf SQL-Server laden

Ein Thema von AndreT · begonnen am 5. Nov 2004 · letzter Beitrag vom 16. Nov 2004
Antwort Antwort
Seite 1 von 2  1 2      
AndreT

Registriert seit: 5. Nov 2004
Ort: Bocholt
82 Beiträge
 
Delphi 2006 Enterprise
 
#1

CSV Datei in eine Tabelle auf SQL-Server laden

  Alt 5. Nov 2004, 14:59
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 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.
Andre
  Mit Zitat antworten Zitat
Benutzerbild von trifid
trifid

Registriert seit: 12. Sep 2003
297 Beiträge
 
#2

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

  Alt 5. Nov 2004, 15:53
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

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

  Alt 5. Nov 2004, 16:05
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 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;
Andreas
  Mit Zitat antworten Zitat
AndreT

Registriert seit: 5. Nov 2004
Ort: Bocholt
82 Beiträge
 
Delphi 2006 Enterprise
 
#4

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

  Alt 5. Nov 2004, 16:05
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.
Andre
  Mit Zitat antworten Zitat
Benutzerbild von trifid
trifid

Registriert seit: 12. Sep 2003
297 Beiträge
 
#5

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

  Alt 5. Nov 2004, 16:12
die bcp.exe findest du unter dem SQL-Server-Verzeichnis
z.B. C:\Programme\Microsoft SQL Server\80\Tools\Binn
  Mit Zitat antworten Zitat
AndreT

Registriert seit: 5. Nov 2004
Ort: Bocholt
82 Beiträge
 
Delphi 2006 Enterprise
 
#6

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

  Alt 8. Nov 2004, 11:22
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.
Andre
  Mit Zitat antworten Zitat
Benutzerbild von trifid
trifid

Registriert seit: 12. Sep 2003
297 Beiträge
 
#7

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

  Alt 8. Nov 2004, 12:23
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
  Mit Zitat antworten Zitat
AndreT

Registriert seit: 5. Nov 2004
Ort: Bocholt
82 Beiträge
 
Delphi 2006 Enterprise
 
#8

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

  Alt 8. Nov 2004, 13:20
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.
Andre
  Mit Zitat antworten Zitat
Benutzerbild von trifid
trifid

Registriert seit: 12. Sep 2003
297 Beiträge
 
#9

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

  Alt 8. Nov 2004, 13:52
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 ?
  Mit Zitat antworten Zitat
AndreT

Registriert seit: 5. Nov 2004
Ort: Bocholt
82 Beiträge
 
Delphi 2006 Enterprise
 
#10

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

  Alt 11. Nov 2004, 10:55
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.
Andre
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:52 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