AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Daten in .txt File schreiben

Ein Thema von Andidreas · begonnen am 7. Jun 2006 · letzter Beitrag vom 8. Jun 2006
Antwort Antwort
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Daten in .txt File schreiben

  Alt 7. Jun 2006, 15:45
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!
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
waseo

Registriert seit: 16. Mai 2006
Ort: Isernhagen
11 Beiträge
 
Delphi 6 Professional
 
#2

Re: Daten in .txt File schreiben

  Alt 7. Jun 2006, 16:38
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Daten in .txt File schreiben

  Alt 7. Jun 2006, 18:03
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
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

Re: Daten in .txt File schreiben

  Alt 8. Jun 2006, 06:49
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 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 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...
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:08 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