Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADO/Access und Textfile importieren (https://www.delphipraxis.net/4821-ado-access-und-textfile-importieren.html)

Jens Schumann 13. Mai 2003 09:58


ADO/Access und Textfile importieren
 
Hallo,
mit folgendem Source schaffe ich es eine Txt-Datei nach Access zu importieren.

Delphi-Quellcode:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ADODB25_TLB, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen } 
  public
    { Public-Deklarationen } 
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM} 
resourcestring
  ConnStr = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Delphi5\Test\ADO\Textfile import;Extended Properties=Text;Persist Security Info=False';
procedure TForm1.Button1Click(Sender: TObject);
var
  aConn : Connection;
  aSQL : String;
  RA   : OleVariant;
  Opt  : OleVariant;
begin
  aSQL:='SELECT * INTO [Test] IN "D:\Delphi5\Test\ADO\Textfile import\db1.mdb" FROM xyz.txt';
  aConn:=CoConnection.Create;
  Try
    aConn.Open(ConnStr,'','',-1);
    aConn.Execute(aSQL,RA,Opt);
  Finally
    aConn.Close;
    aConn:=Nil;
    end;  
end;
Meine Test Txt-Datei sieht so aus:


F1;F2;F3;F4
'dsfsadf';'234';'5tv';324,004
'gfh';'6564';'rt';345,45
'gfh';'4566';'rr';23,3
'vcn';'564';'rtz';43543,4
Beim Import werden jedoch die ' mitgenommen. Wie kann ich die ' unterdrücken?
Schließlich handelt es sich hier nur um Textbegrenzungszeichen.
Weglassen geht nicht, da die Txt-Datei mit der ich arbeiten muss nicht von mir stammt.

Hansa 13. Mai 2003 10:34

ich würde die ' rauspflücken, mit Hilfe einer zweiten Datei.

Jens Schumann 13. Mai 2003 10:58

Hallo Hansa,
das geht leider nicht.
Wenn ich die ' in der Spalte F2 entferne wird das Feld nicht als Text sondern als Zahl importiert. Damit verliere ich aber die Typenkonsistenz zu anderen Systemen. Außerdem ist die Textdatei, die ich verwenden muss ca. 300 MB groß.

Hansa 13. Mai 2003 11:40

Tja, kenne ADO leider nicht, aber ich habe bei so was schon fast Schiffbruch erlitten, fertige Komponenten für sowas sind anscheinend sehr fehleranfällig und unflexibel. Deshalb habe ich das ganze so gemacht:

Code:
procedure TForm1.Button1Click(Sender: TObject);
VAR k : textfile;
    zeile : string;
begin
  AssignFile (k,'C:\DB\PERSSQL');
  reset (k);
  PersDataSet.open;
  WHILE NOT EOF (k) DO BEGIN
    readln (k,zeile);
    PersDataSet.insert;
    PersDataSet.FindField('ID').AsInteger := StrToInt (copy (zeile,1,10));
    PersDataSet.FindField('NR').AsInteger := StrToInt (copy (zeile,11,5));
    PersDataSet.FindField('PERSONART').AsString := copy (zeile,16,1);
    PersDataSet.FindField('ANREDE').AsString := copy (zeile,17,30);
    PersDataSet.FindField('NAME').AsString := copy (zeile,47,30);
    PersDataSet.FindField('STRASSE').AsString := copy (zeile,77,30);
    PersDataSet.FindField('ORT').AsString := copy (zeile,107,30);
    PersDataSet.FindField('GEBURTSTAG').AsDateTime := StrToDateTime (copy (zeile,137,10));
    PersDataSet.FindField('EINTRITTSDATUM').AsDateTime := StrToDateTime (copy (zeile,147,10));
    PersDataSet.FindField('TELEFONPRIVAT').AsString := copy (zeile,157,20);
    PersDataSet.FindField('FAX').AsString := copy (zeile,177,20);
    PersDataSet.FindField('BLZ').AsString := copy (zeile,197,10);
    PersDataSet.FindField('KONTONR').AsString := copy (zeile,207,10);
    PersDataSet.FindField('BANK').AsString := copy (zeile,217,30);
    PersDataSet.Post;
  END;
  CloseFile (k);
  DataBase.Commit;
  ShowMessage ('Konvertierung erfolgreich beendet !');
  close;
end;
Der Unterschied, zu Deinem Problem ist allerdings, bei mir war auch die Textdatei von mir und da habe ich kurzerhand feste Feldlängen verwendet. Aber mit dem ; das sollte so ähnlich laufen. Meine Erfahrung ist mittlerweile, in den sauren Apfel zu beißen und das ganze selber zu machen. Dauert zwar ewig, aber Ziel ist in Sicht.


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