Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi parse textfile to paradox (https://www.delphipraxis.net/47334-parse-textfile-paradox.html)

bart57 9. Jun 2005 14:24


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:
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! !
Danke im Voraus!

[edit=alcaeus]Delphi- und Code-Tags eingefuegt. In Zukunft bitte selbst machen :) Mfg, alcaeus[/edit]

Memo 9. Jun 2005 15:27

Re: parse textfile to paradox
 
Du kannst eine Stringlist verwenden. Setze den Delimiter nach wahl ein und lies mit DelimitedText ein.

marabu 9. Jun 2005 16:54

Re: parse textfile to paradox
 
Hallo bart57,

kleine Starthilfe - nur schnell hier getippt und nicht getestet:

Delphi-Quellcode:
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;
Das ist ein naiver Ansatz, eventuell kannst du mit TTable.BatchMove() die Laderate deutlich erhöhen.

Grüße vom marabu

bart57 10. Jun 2005 08:27

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

alzaimar 10. Jun 2005 08:45

Re: parse textfile to paradox
 
Ich habe mir vor 170 Jahren diese Funktion geschrieben...:
Delphi-Quellcode:
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;
Die Funktion teilt einen String S beim ersten Auftreten des Trenners Del , schnippelt das Teil vorne weg und liefert den abgetrennten Teil zurück.
Delphi-Quellcode:
S := 'Abc|def';
a := Split (S,'|');
// a = 'Abc' und S = 'def'
b := Split (S,'|');
// b = 'def' und S = ''
Damit kannst Du dein Problem einfach lösen:
Delphi-Quellcode:
function fParse (Count: Integer;S,Char: string): string;
Var
  i : Integer;
Begin
  For i:=1 to Count Do Result := Split (S,Char);
End;
Die Funktion liefert einen leeren String, wenn es kein 'count'.es Element in dem String gibt.
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.

marabu 10. Jun 2005 08:56

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:
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;
Damit kann ich meinen Demo-Code an D5 anpassen:

Delphi-Quellcode:
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;
Da kommt mir aber noch ein Verdacht: Wieviel Erd-Jahre hat eigentlich ein alzaimar-Jahr?

Freundliche Grüße vom marabu

bart57 10. Jun 2005 13:50

Re: parse textfile to paradox
 
Vielen Dank!

Aber leider ist es nicht schneller wie die Methode
die ich bisher benutz :-(

alzaimar 10. Jun 2005 14:11

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 www.swissdelphicenter.ch oder www.torry.net
FastStrings ist eine Sammlung von schnelleren Stringroutinen. Vielleicht wirst Du da fündig.

marabu 10. Jun 2005 15:50

Re: parse textfile to paradox
 
Hallo Bart57,

Zitat:

Zitat von bart57
Aber leider ist es nicht schneller wie die Methode die ich bisher benutz :-(

gib doch mal die Durchsatzraten für deine Parse-Routine und für deine Load-Routine getrennt an, damit ich mir ein Bild machen kann. Wie misst du? Wo ist der Engpass - beim Parsen oder beim Laden? Hast du schon BatchMove() ausprobiert? Wieviel Millionen Zeilen musst du laden? Wie oft? Sind deine Beispieldaten repräsentativ?

marabu

@alzaimar: 7:1 - ich hatte mir schon sowas gedacht...

Kedariodakon 10. Jun 2005 16:30

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 09:18 Uhr.
Seite 1 von 2  1 2      

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