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.
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;
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.
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
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
Synes godt om
Ny brugerNybegynder
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.