![]() |
parse textfile to paradox
Hallo,
ich suche eine allgemeine schnelle Methode um mehrere Text-Dateien mit trenner in Tabellen zu schreiben. Ich habe es mit reanln, mit stringlist.loadfromfile versucht. Ich habe es mit copy, und mit folgende pasre-Funktion versucht:
Delphi-Quellcode:
function fParse(Count: Integer;S,Char: string): string;
var I: Integer; T: string; begin // How do I get the "B" from "A|B|C|D|E|F"? //==> Parse('|', 'A|B|C|D|E|F', 2) { sStand := Trim(fParse(#9,slfiles[0],2)); // sStand := Trim(getWrappos(1,slfiles[0],#9)); } try if trim(s)='' Then begin result:=''; exit; End; if S[Length(S)] <> Char then begin S := S + Char end; for I := 1 to Count do begin T := Copy(S, 0, Pos(Char, S) - 1); S := Copy(S, Pos(Char, S) + 1, Length(S)); end; Result := T; except result:=''; end; end; Es ist aber alles zu langsam :-( Dateien beispiel:
Code:
0000!XXXX!DTC !LIN Y,Z,G !EVT ! 54 00A !0240200101! 03! ! 54 08E !04::15 !DTRE ! ! !211-BASTPBD!
0000!XXXX!DTC !LOUT Y,Z,G!EVT ! 54 00A !0240200104! 06! ! 54 08E !04::15 !DTRE ! ! !211-BASTPBD! 0001!XXXX!DTC !LIN Y,Z,G !EVT ! 54 00A !0251000501! 03! ! 54 08E !08::15 !DTRE ! ! !211-BASTPBD! 0001!XXXX!DTC !LOUT Y,Z,G!EVT ! 54 00A !0251000504! 06! ! 54 08E !08::15 !DTRE ! ! !211-BASTPBD! oder
Code:
Danke im Voraus!
0012!NAT1!01-0-01-7!D1-KOELN !J ! 4!0017!0102! 1!0042!0231! 3! 3! !TER! !
0012!NAT1!01-0-01-7!D1-KOELN !J ! 5!0049!0132! 1!0041!0200! 3! 3! !TER! ! 0012!NAT1!01-0-01-7!D1-KOELN !J ! 6!0025!0103! 1!0042!0231! 4! 4! !TER! ! [edit=alcaeus]Delphi- und Code-Tags eingefuegt. In Zukunft bitte selbst machen :) Mfg, alcaeus[/edit] |
Re: parse textfile to paradox
Du kannst eine Stringlist verwenden. Setze den Delimiter nach wahl ein und lies mit DelimitedText ein.
|
Re: parse textfile to paradox
Hallo bart57,
kleine Starthilfe - nur schnell hier getippt und nicht getestet:
Delphi-Quellcode:
Das ist ein naiver Ansatz, eventuell kannst du mit TTable.BatchMove() die Laderate deutlich erhöhen.
procedure LoadFromText(table: TTable; filename: string);
var line: string; sl: TStringList; i: integer; begin AssignFile(input, filename); Reset(input); sl := TStringList.Create; sl.Delimiter := '!'; while not Eof do begin ReadLn(line); sl.DelimitedText := line; table.Append; for i := 0 to sl.Count - 1 do table.Fields[i].AsString := Trim(sl[i]); table.Post; end; sl.Free; CloseFile(input); end; Grüße vom marabu |
Re: parse textfile to paradox
hallo marabu,
DelimitedText gibt es in Delphi 5 nicht :-( Ich habe an eine Methode mit Streams gedacht aber ich kenne mich mit Streams gar nicht aus... Danke |
Re: parse textfile to paradox
Ich habe mir vor 170 Jahren diese Funktion geschrieben...:
Delphi-Quellcode:
Die Funktion teilt einen String S beim ersten Auftreten des Trenners Del , schnippelt das Teil vorne weg und liefert den abgetrennten Teil zurück.
Function Split (Var S : String; Del : String) : String;
Var p : Integer; Begin p:=pos(Del,S); if p=0 then Begin Result:=s; s:=''; end else begin Result := Copy(s,1,p-1); s:=Copy(s,p+length(Del),length (s)); End; End;
Delphi-Quellcode:
Damit kannst Du dein Problem einfach lösen:
S := 'Abc|def';
a := Split (S,'|'); // a = 'Abc' und S = 'def' b := Split (S,'|'); // b = 'def' und S = ''
Delphi-Quellcode:
Die Funktion liefert einen leeren String, wenn es kein 'count'.es Element in dem String gibt.
function fParse (Count: Integer;S,Char: string): string;
Var i : Integer; Begin For i:=1 to Count Do Result := Split (S,Char); End; Eventuell hilft es, den Elemente des Strings in ein Array zu packen, falls Du nicht nur auf ein Element zugreifen willst. Nebenbei gibt es hier diverse Implementierung der 'explode' Funktion, die das (vermutlich viel besser) macht. |
Re: parse textfile to paradox
170 Jahre? Und ich dachte ich wäre alt...
An anderer Stelle hier im Forum habe ich das hier gefunden:
Delphi-Quellcode:
Damit kann ich meinen Demo-Code an D5 anpassen:
function ParseStr(var S: String; delimit: string; purge: boolean): string;
var i: integer; begin for i := 1 to Succ(Length(S)) do if (i > Length(S)) or (Pos(S[i], Delimit) > 0) then Break; Result := Copy(S, 1, Pred(i)); Dec(i, Ord(not purge)); Delete(S, 1, i); end; procedure ExtractFields(s, delimiters: string; sl: TStrings); var t: string; begin sl.Clear; while s <> '' do begin t := ParseStr(s, delimiters, true); if t <> '' then sl.Add(t); end; end;
Delphi-Quellcode:
Da kommt mir aber noch ein Verdacht: Wieviel Erd-Jahre hat eigentlich ein alzaimar-Jahr?
procedure LoadFromText(table: TTable; filename: string);
var line: string; sl: TStringList; i: integer; begin AssignFile(input, filename); Reset(input); sl := TStringList.Create; while not Eof do begin ReadLn(line); ExtractFields(line, '!', sl); table.Append; for i := 0 to sl.Count - 1 do table.Fields[i].AsString := Trim(sl[i]); table.Post; end; sl.Free; CloseFile(input); end; Freundliche Grüße vom marabu |
Re: parse textfile to paradox
Vielen Dank!
Aber leider ist es nicht schneller wie die Methode die ich bisher benutz :-( |
Re: parse textfile to paradox
@marabu: 7 alzaimjahre sind 1 normales Jahr. Liegt vielleicht am Lebenswandel :zwinker:
@Bart57: Dann such doch mal nach 'FastStrings' bei ![]() ![]() FastStrings ist eine Sammlung von schnelleren Stringroutinen. Vielleicht wirst Du da fündig. |
Re: parse textfile to paradox
Hallo Bart57,
Zitat:
marabu @alzaimar: 7:1 - ich hatte mir schon sowas gedacht... |
Re: parse textfile to paradox
Hallo bart57,
Du fügst Deine ausgelesenen Teile aber nicht gleich in eine TStringlist auf der Form ein oder? Wenn ja, dann tu das nicht, wenn nein beantworte marabus Frage :zwinker: Bye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz