AGB  ·  Datenschutz  ·  Impressum  







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

parse textfile to paradox

Ein Thema von bart57 · begonnen am 9. Jun 2005 · letzter Beitrag vom 23. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
bart57

Registriert seit: 30. Mär 2004
51 Beiträge
 
#1

parse textfile to paradox

  Alt 9. Jun 2005, 14:24
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]
Gruß,Gilles
  Mit Zitat antworten Zitat
Benutzerbild von Memo
Memo

Registriert seit: 19. Aug 2003
509 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: parse textfile to paradox

  Alt 9. Jun 2005, 15:27
Du kannst eine Stringlist verwenden. Setze den Delimiter nach wahl ein und lies mit DelimitedText ein.
  Mit Zitat antworten Zitat
marabu

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

Re: parse textfile to paradox

  Alt 9. Jun 2005, 16:54
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
  Mit Zitat antworten Zitat
bart57

Registriert seit: 30. Mär 2004
51 Beiträge
 
#4

Re: parse textfile to paradox

  Alt 10. Jun 2005, 08:27
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
Gruß,Gilles
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: parse textfile to paradox

  Alt 10. Jun 2005, 08:45
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
marabu

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

Re: parse textfile to paradox

  Alt 10. Jun 2005, 08:56
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
  Mit Zitat antworten Zitat
bart57

Registriert seit: 30. Mär 2004
51 Beiträge
 
#7

Re: parse textfile to paradox

  Alt 10. Jun 2005, 13:50
Vielen Dank!

Aber leider ist es nicht schneller wie die Methode
die ich bisher benutz
Gruß,Gilles
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: parse textfile to paradox

  Alt 10. Jun 2005, 14:11
@marabu: 7 alzaimjahre sind 1 normales Jahr. Liegt vielleicht am Lebenswandel
@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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
marabu

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

Re: parse textfile to paradox

  Alt 10. Jun 2005, 15:50
Hallo Bart57,

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...
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: parse textfile to paradox

  Alt 10. Jun 2005, 16:30
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

Bye
Christian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:30 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