Avatar billede klasker Nybegynder
15. september 2003 - 18:08 Der er 5 kommentarer

Dele en tekst op i bidder

Jeg har allerede en funktion til dette, men den er temmelig processor krævende og jeg vil gerne have en mere optimeret udgave.

Funktionen skal kun gemme bestemte tegn, samtidig skal tegnene være "kategori-inddelt" så tegn og text adskilles.
F.eks skal
  call MyFunction(GetMyValue+5)
blive til:
  call
  MyFunction
  (
  GetMyValue
  +
  5
  )

Jeg har på fornemmelsen at jeg skal bruge noget der hedder "Regular Expressions" som jeg kender fra PHP, men jeg ved ikke hvordan man bruger dem i Delphi.

Bemærk at funktionen ikke behøver at bruge Regular Expressions.

Jeg undlader at skrive min nuværende funktion her, da den er meget lang, uigennemskuelig og ugeneraliseret.
Avatar billede doc404 Novice
15. september 2003 - 19:40 #1
Det hedder en parser eller tokenizer og der er skrevet tykke bøger om emnet, men her er en simpel en du kan komme igang med.

function GetToken(var p : PChar; var Token : string) : boolean;
begin
  Result := True;
  Token := '';
  while p^ in [' ',#9] do Inc(p); // skip white space
  case p^ of
    'a'..'z','A'..'Z': // abc eller abc12, første skal være A..Z,a..z
      begin
        while p^ in ['a'..'z','A'..'Z','0'..'9'] do
        begin
          Token := Token + p^; Inc(p);
        end;
      end;
    '0'..'9': // numbers
      begin
        while p^ in ['0'..'9'] do
        begin
          Token := Token + p^; Inc(p);
        end;
      end
    #00: // end of text
      begin
        Result := False;
      end;
    else
      Token := p^; Inc(p);
  end;
end;

procedure ParseText(const Text : string);
var
  p : PChar;
  s : string;
begin
  p := PChar(Text);
  while GetToken(p,s) do
  begin
    // s has your token
  end;
end;
Avatar billede martinlind Nybegynder
15. september 2003 - 20:43 #2
Der ligger også en lille parser indbygget i delphi, jeg kan ikke huske hvor den ligger kig evt. i hjælpen eller søg i de unit's der er source til
Avatar billede klasker Nybegynder
15. september 2003 - 20:58 #3
Martinlind> Har prøvet... uden held.

Doc404>  Den kode som doc404 kom med minder meget om min egen.
Jeg fandt imidlertid ud af at det ikke er den funktion der var grunden til at mit program var 5 minutter om at åbne en fil på 655 linier. Det var fordi jeg glemte at nulstille diverse events imens.

Nu tager det ca. 2200 millisekunder at åbne den samme fil, hvilket stadig er over det optimale så jeg lader spørgsmålet køre lidt endnu og ser om der kommer nogle guldkorn flyvende.
Avatar billede martinlind Nybegynder
15. september 2003 - 21:01 #4
du kan optimere meget ved at læse din fil ind i mem. og så parse den, bruge evt en TStringList.loadfromfile, den har jeg selv brugt med stor hastighedsforøgelse

/Martin
Avatar billede doc404 Novice
15. september 2003 - 21:55 #5
Hvad med at loade hele filen på en gang i en TMemoryStream?

..
ms : TMemoryStream;
begin
  ms := TMemoryStream.Create;
  ms.LoadFromFile('xyz.dat');
  ParseText(PChar(ms.Memory)); // lav ParseText om til ParseTExt(p : PChar)...
  ms.Free;
end;

Det burde gå rigtig stærkt, men hvad gør du med dine tokens?

/doc
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

Seneste spørgsmål Seneste aktivitet
I dag 10:21 Ny printer, men hvilken Af mort1 i Printere
I går 19:41 USB på Linux Af Uvanga i Linux
12/0818:26 Hvilken type mus Af mort1 i PC
11/0813:21 ms Forms Af leahcim i Andet software
10/0821:30 Blokeret på Snapchat? Af LineP i Chat & Messaging