Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Textdatei Zeichen in bestimmter Zeile löschen (https://www.delphipraxis.net/68268-textdatei-zeichen-bestimmter-zeile-loeschen.html)

bundy 27. Apr 2006 08:50


Textdatei Zeichen in bestimmter Zeile löschen
 
Moin Moin

Ich erstelle ein Dumpfile, das mehere Insert´s besitzt.
Jetzt will ich in der vorletzten Zeile folgendes änderen ("," -->";")


Dumpfile

Code:

LOCK TABLES callstemp WRITE;
INSERT INTO callstemp VALUES
(null,"8040197196","Inland","NB-Neusiedl/See","2006-03-01","02167 2603           ","08:03:57","0.45","0.0167","GZ"),
(null,"8040197196","Inland","NB-Neusiedl/See","2006-03-01","02167 2882           ","09:07:53","0.983333333333333","0.04012","GZ"),
(null,"8040197196","Inland","NB-Nickelsdorf","2006-03-05","02146 20007          ","16:24:30","20.5833333333333","0.8398","GZ"),
(null,"8040197196","Inland","Wien","2006-03-06","01 51215074          ","13:09:41","0.15","0.0167","GZ"),
(null,"8040197196","Inland","NB-Neusiedl/See","2006-03-06","02167 7203           ","15:07:49","2.41666666666667","0.0986","GZ"), <<====== Dieses Zeichen muss ein ";" werden.
UNLOCK TABLES;
lg
Bundy

marabu 27. Apr 2006 09:18

Re: Textdatei Zeichen in bestimmter Zeile löschen
 
Hallo.

Wenn du diese Dump-Files erzeugst, warum berichtigst du dann nicht einfach den erzeugenden Code anstelle vom Output?

Wenn du aber keine Kontrolle über den erzeugenden Code hast, dann wäre es wichtig das genaue Format zu kennen. Sind die Umbrüche korrekt wiedergegeben?

Ein möglicher Ansatz wäre die gepufferte Umsetzung mit einem look ahead von einer Zeile:

Delphi-Quellcode:
procedure AdjustScript(fn: TFileName);
var
  tfIn, tfOut: TextFile;
  line, buffer: String;
begin
  AssignFile(tfIn, fn);
  Reset(tfIn);
  AssignFile(tfOut, ChangeFileExt(fn, '.tmp'));
  Rewrite(tfOut);

  buffer := '';
  while not Eof(tfIn) do
  begin
    ReadLn(tfIn, line);
    if (line = '') or (line[Length(line)] = ';') then
      if (buffer <> '') and (buffer[Length(buffer)] = ',') then
        buffer[Length(buffer)] := ';';
    if buffer <> '' then
      WriteLn(tfOut, buffer);
    buffer := line;
  end;

  CloseFile(tfOut);
  CloseFile(tfIn);
end;
Getippt und nicht getestet.

Grüße vom marabu

Klaus01 27. Apr 2006 09:22

Re: Textdatei Zeichen in bestimmter Zeile löschen
 
alles in eine Stringlist laden
den zweit letzten String in der Liste bearbeiten und das letzte Zeichen
des String durch ein ';' ersetzen.

Delphi-Quellcode:
sl:=TStringList.create;
sl.strings.loadfromFile(yourdumpfile);

s:=sl.strings[count-2]; // count -1 liefert den letzten String der Liste
s[length(s)]:=';';
sl.strings[count-2]:=s;
sl.strings.savetoFile(yourDumpfile);
sl.free;
Grüße
Klaus

bundy 27. Apr 2006 09:52

Re: Textdatei Zeichen in bestimmter Zeile löschen
 
Ich will das Ganze File nicht in einen String laden, da stehen ca. 250.000 Datensätze drinnen und das werden ständig mehr. (Einzelpespräche von Telefon Kunden).


So erstelle ich das Ding.
Delphi-Quellcode:
procedure tuser.ImportFileEinlesen;
var
x,y,flag,counter:integer;
Anlagennummer,Dataline,Zone,O1Calldate,O1Destnumber,O1Destdesciption,O1CallStartTime:string;
O1CallDuration,O1Callprice,Importfilename,GZFZ:string;
DurationStringHHHH,DurationStringMM,DurationStringSS,DurationStringSumme:String;
CallStartHH,CallStartMM,CallStartSS,CallDateDD,CallDateMM,CallDateYY:string;
DurationIntHHHH,DurationIntMM,DurationIntSS:integer;
Duration,Summe,Unitpreis,DurationIntSumme:Double;
CallStartTime,FreizeitAnfang,FreizeitEnde,GeschaeftszeitAnfang,GeschaeftszeitEnde:TTime;
aFile:TextFile;
begin
 AssignFile(aFile,ExtractFilePath(Application.ExeName)+'\Dumpfile\dumpfile.sql');
 Rewrite(aFile);
 Writeln(aFile,DumpHeader.Text);
 Writeln(aFile,'LOCK TABLES callstemp WRITE;');
 Writeln(aFile,'INSERT INTO callstemp VALUES ') ;

 counter:=0;

for x := 0 to fimoprtStringlist.Count-1 do
  begin
    inc(counter);
    fmMain.Gauge1.MaxValue:=fimoprtStringlist.Count;
    fmMain.Gauge1.Progress:=x;
    application.ProcessMessages;
    ..
    //Berechnung der Datenfelder (ca 4 Seiten Code. den hab ich mal nicht gepostet)
    ..

    if (counter < 100) then
    begin
    writeln(aFile,'(null,"'+Anlagennummer+'","'+Zone+'","'+O1Destdesciption+'","'+FormatDateTime('YYYY-MM-DD',StrToDate(CallDateDD+'.'+CallDateMM+'.'+CallDateYY))+'","'+O1Destnumber+'","'+TimeToStr(CallStartTime)+'","'+BeistrichAufPunkt(FloatToStr(DurationIntSumme))+'","'+BeistrichAufPunkt(FloatToStr(Summe))+'","'+GZFZ+'"),');
    end
    else
    begin
    counter:=0;
    writeln(aFile,'(null,"'+Anlagennummer+'","'+Zone+'","'+O1Destdesciption+'","'+FormatDateTime('YYYY-MM-DD',StrToDate(CallDateDD+'.'+CallDateMM+'.'+CallDateYY))+'","'+O1Destnumber+'","'+TimeToStr(CallStartTime)+'","'+BeistrichAufPunkt(FloatToStr(DurationIntSumme))+'","'+BeistrichAufPunkt(FloatToStr(Summe))+'","'+GZFZ+'");');
    writeln(aFile,'INSERT INTO callstemp VALUES ') ;

    end;
end;
Das Problem ist das das Importfile, welches ich auf fimoprtStringlist lade , hat nicht in jeder Zeile einen Datensatz, sonst könnte ich ja den fimoprtStringlist.count -2 benutzen.
Sieht ca so aus das File welches ich importiere

Code:
A1Priority Telecom GmbH        Erdbergstraße 52-60           A-1030 Wien                  
A20800 252 290                  000000000                 [email]businessinfo@priority.at[/email]    
A32015100696920222PRIORITY TELECOM GMBH        
B1ÖLREINIGUNG GMBH                                              
B2AUGASSE 13                      70211 SIGENDORF                
B3                                                               
B48040187200                                                     
B58040187200                      8040187200                     
B6                                                               
B7OESTERR.POSTSPARK.           6000000075659723                                           
C18104512011029662720051104200511182005100120051031N2000000COY
D100000000000+00000000000+00000000000+00000000000+
F10268720300   BKF Wholesale 710000139140000000209+0000000000+0000000000+0000000209+
I1Zahlung für Kaution               0000036336+
I1Anpassung Kaution                 0000036336-
I1Übertrag auf Hauptkto. 8104406-01/10000036336+
I1Übertrag auf Hauptkto. 8104406-01/10000000209-
J10000000000+00200000000000+0000000000+
K10268720300   BKF Wholesale
N1on-Net            
O10510051947 1960           Priority Telecom        08184800000121               0000000000+
O11710001945 4800           Priority Telecom        11343200000018               0000000000+
O117100501945 4800          Priority Telecom        11352500000108               0000000000+
O12510050967 6937           Priority Telecom        11025600000005               0000000000+
O12510050967 6937           Priority Telecom        11095100000529               0000000000+
P1GESCHÄFTSZ00000500000821000000000000000+
N1Inland
O101100501 6162997           Wien                    12465700000037               0000000001+
O103100501 313263366         Wien                    13570900000027               0000000001+
O110100501 601223560         Wien            

..
..
Auf Grund der Variablen am Satzanfang werte ich die Zeilen aus.

lg
Bundy


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