Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Daten in .txt File schreiben (https://www.delphipraxis.net/70981-daten-txt-file-schreiben.html)

Andidreas 7. Jun 2006 15:45


Daten in .txt File schreiben
 
hallo zusammen,

ich hab hier auch schon mal einen thread aufgemacht wos drum ging ein text file auszulesen.... des klappt jetzt perfekt...

bloss jetzt hab ich grad ein problem damit, dass ich keine daten in ein text file schreiben kann :(

hintergrund is folgender...
ich muss für meinen chef ein 24 mb grosses txt file einlesen und in eine db datei ausgeben...
jetzt hab ich aber festgestellt, das in dem txt file das ich einles sätze vorhanden sind die "kaputt" sind und so in meiner insert routine eine exception verursachen...
damit ich herrausfinde bei welchen sätzen das passiert wollt ich dann einfach denn sql befehl ausm programm in ein txt file schreiben das ich mir hinterher in ruhe durchlesen kann...

der fehler denn ich bekomme lautet: Text File Could Not Read

ich hab hier mal des code bsp. aus meinem programm indem ich die db datei erstelle...
Delphi-Quellcode:
procedure TMain_Form.prADDLOGMAT(aErg : Array of String);

var
s, sDirec : String;
txtFile  : TextFile;

begin

  sDirec := '..\Error\Error.txt';
  {$I-}
  AssignFile(txtFile,sDirec);
  Reset(txtFile);

  Try
   With(dbm.LOGMATQuery) Do
   Begin
    Application.ProcessMessages;
    SQL.Clear;
    s :=  ('Insert Into DB1.DAT1 (Fld1, Fld2, Fld3, Fld4, Fld5, Fld6, '
    +'      Fld7, Fld8, Fld9, Fld10, Fld11, Fld12, '
    +'      Fld13, Fld14, Fld15, Fld16, Fld17, Fld18, '
    +'      Fld19, Fld20, Fld21, Fld22, Fld23) '
    +'Values(''' +aErg[0]+ ''', ''' +aErg[1]+ ''', ''' +aErg[2]+ ''', '
    +' ''' +aErg[3]+ ''', ''' +aErg[4]+ ''', ''' +aErg[5]+ ''', '
    +' ''' +aErg[6]+ ''', ''' +aErg[7]+ ''', ''' +aErg[8]+ ''', '
    +' ''' +aErg[9]+ ''', ''' +aErg[10]+ ''', ''' +aErg[11]+ ''', '
    +' ''' +aErg[12]+ ''', ''' +aErg[13]+ ''', ''' +aErg[14]+ ''', '
    +' ''' +aErg[15]+ ''', ''' +aErg[16]+ ''', ''' +aErg[17]+ ''', '
    +' ''' +aErg[18]+ ''', ''' +aErg[19]+ ''', ''' +aErg[20]+ ''', '
    +' ''' +aErg[21]+ ''', ''' +aErg[22]+ ''') ');
      SQL.Add(s);
      dbm.DAT1Query.ExecSQL;
      End;
    Except
      s := s + #13;
      Writeln(txtFile,s);
    End;

    CloseFile(txtFile);
    {$I+}

end;

hat jemand ne idee was hier falsch läuft...
also des txt file is in dem ordner angelegt, das sollte der nicht der grund sein...



Edit: hab denn Quellcode bischen editiert damit er leichter zu lesen is!

waseo 7. Jun 2006 16:38

Re: Daten in .txt File schreiben
 
Moin!

Schonmal in der Online-Hilfe nachgesehen? Dort steht unter "Reset":

Zitat:

In Delphi öffnet Reset die in F angegebene externe Datei in dem Modus, der in der globalen Variable FileMode festgelegt ist. Ist keine Datei mit diesem Namen vorhanden oder kann die Datei nicht im aktuellen Dateimodus geöffnet werden, tritt ein Fehler auf.
Versuch's also mal mit Rewrite statt Reset.

marabu 7. Jun 2006 18:03

Re: Daten in .txt File schreiben
 
Hallo Andreas,

vielleicht möchtest du deine Prozedur noch etwas verbessern. Der Zweck scheint mir das versuchsweise Einfügen eines Datensatzes in eine Datenbank-Tabelle zu sein - bei Misserfolg das Wegschreiben in eine Protokolldatei. Leider hast du weder das verwendete RDBMS noch die Zugriffskomponenten mitgeteilt.

Die Datenbanktabelle scheint mir von einem Tool angelegt worden zu sein. Vermutlich könntest du die Daten auch mit diesem oder einem anderen Tool importieren - ohne eine einzige Zeile Code geschrieben zu haben. Wenn du mit den BDE-Komponenten arbeiten solltest, dann würde dir TBatchMove die Arbeit vielleicht erleichtern.

Wenn du aber deinen Weg weiter gehen möchtest, dann besser so:

Delphi-Quellcode:
procedure TMainForm.TryInsertRecord(q: TQuery; s: TStrings);
var
  i: Integer;
begin
  with q do
  begin
    for i := 0 to Pred(ParamCount) do
      Params[i].Value := s[i];
    try
      ExecSql;
    except
      Log(s); // 
    end;
  end;
end;
Import-Fehler entstehen bei deiner Vorgehensweise schon dann, wenn die Daten ein Apostroph enthalten. Bereite die Query-Komponente nur einmal vor und in der Prozedur TryInsertRecord() werden dann einfach nur die Parameterwerte ausgetauscht.

Auch die Vorbereitung der Protokoll-Datei mit AssignFile() muss nicht mehrere tausendmal ausgeführt werden. Diesen Code solltest du besser in die aufrufende Prozedur auslagern. Öffnen und Schließen kannst du die Datei in der Prozedur Log() nach folgendem Muster:

Delphi-Quellcode:
procedure TMainForm.Log(s: TStrings);
begin
  if FileExists(LogFileName)
    then Append(LogFile)
    else Rewrite(LogFile);
  WriteLn(LogFile, s.CommaText);
  CloseFile(LogFile);
end;
Getippt und nicht getestet.

Grüße vom marabu

Andidreas 8. Jun 2006 06:49

Re: Daten in .txt File schreiben
 
danke für eure tipps

@waseo
ja das hab ich inzwischen auch gesehen ^^ war mal wieder etwas zu schnell mit dem posten

@marabu
hier noch die fehlenden information:
Delphi Win32
MySQL DB 4.1.19
Zugriff über MySQLDAC

Zitat:

Zitat von marabu
Der Zweck scheint mir das versuchsweise Einfügen eines Datensatzes in eine Datenbank-Tabelle zu sein - bei Misserfolg das Wegschreiben in eine Protokolldatei.

leider nicht ganz richtig, eigentlich sollte JEDER Datensatz aus dem .txt file später in der db datei stehen...
mich würde im moment nur interessieren bei welchen sätzen ein fehler vorkommt und woran das liegt...

Zitat:

Zitat von marabu
Die Datenbanktabelle scheint mir von einem Tool angelegt worden zu sein. Vermutlich könntest du die Daten auch mit diesem oder einem anderen Tool importieren - ohne eine einzige Zeile Code geschrieben zu haben. Wenn du mit den BDE-Komponenten arbeiten solltest, dann würde dir TBatchMove die Arbeit vielleicht erleichtern.

jupp die datei habe ich über den MySQL Browser angelegt... vielleicht kennst du denn...
leider hab ich da bis jetzt noch nicht die möglichkeit in diesem tool gefunden daten zu importieren...

die anregungen wie ich meine prozedur gestalten kann sind sehr nützlich werds ungefähr so machen:

Delphi-Quellcode:
procedure TMain_Form.prADDLOGMAT(aErg : Array of String, sRow : String);

var
s : String;


begin

  Try
   With(dbm.LOGMATQuery) Do
   Begin
    Application.ProcessMessages;
    SQL.Clear;
    s :=  ('Insert Into DB1.DAT1 (Fld1, Fld2, Fld3, Fld4, Fld5, Fld6, '
    +'      Fld7, Fld8, Fld9, Fld10, Fld11, Fld12, '
    +'      Fld13, Fld14, Fld15, Fld16, Fld17, Fld18, '
    +'      Fld19, Fld20, Fld21, Fld22, Fld23) '
    +'Values(''' +aErg[0]+ ''', ''' +aErg[1]+ ''', ''' +aErg[2]+ ''', '
    +' ''' +aErg[3]+ ''', ''' +aErg[4]+ ''', ''' +aErg[5]+ ''', '
    +' ''' +aErg[6]+ ''', ''' +aErg[7]+ ''', ''' +aErg[8]+ ''', '
    +' ''' +aErg[9]+ ''', ''' +aErg[10]+ ''', ''' +aErg[11]+ ''', '
    +' ''' +aErg[12]+ ''', ''' +aErg[13]+ ''', ''' +aErg[14]+ ''', '
    +' ''' +aErg[15]+ ''', ''' +aErg[16]+ ''', ''' +aErg[17]+ ''', '
    +' ''' +aErg[18]+ ''', ''' +aErg[19]+ ''', ''' +aErg[20]+ ''', '
    +' ''' +aErg[21]+ ''', ''' +aErg[22]+ ''') ');
      SQL.Add(s);
      dbm.DAT1Query.ExecSQL;
      End;
    Except
      s := s + #13;
      Writeln(txtFile,s);
    End;

end;
das assignfile, rewrite, close werd ich in einer anderen prozedur erledigen (wahrschinlich in der Prozedur wo ich mein .txt file einlese)
ich denk mal des macht mehr sinn... bzw. ist der richtigere weg???

was meint ihr???

und ich lass mir zusätzlich die denn kompletten satz aus dem .txt file übergeben, dann hab ich noch zusätzlich die daten wie sie ursprünglich waren ohne sql befehle...


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