Avatar billede atlanta Nybegynder
04. september 2002 - 20:19 Der er 21 kommentarer og
1 løsning

læs og find selv en titel :/ kan ikke finde på en selv

hey jeg har jo spørgsmål ..

jeg er igang med at læse en txt fil ind:
var
  Fil: integer;
  Buffer: PChar;
  FilLength: integer;
  BytesRead: Integer;
  i: integer;
begin
  Fil := FileOpen('logfil.txt', fmOpenRead);
  FilLength := FileSeek(Fil,0,2);
  FileSeek(Fil,0,0);
  Buffer := PChar(AllocMem(FilLength + 1));
  BytesRead := FileRead(Fil, Buffer, FilLength);
  FileClose(Fil);
  for i := 0 to BytesRead-1 do begin
  memo1.Lines.Add(Buffer[i]);
  end;
end;

Dette er den kode jeg lige kunne finde på til at læse txten ind med.

Al den txt jeg har læst ind havde jeg tænkt mig at gemme i et record, men er det nu også den mest hensigtsmessige ting at gører, jeg skal nemlig lave et output til sidst hvor jeg har lagt alle de ting sammen som måske optræder flere gang med forskellig verdi og til sidst skal alt sorteres efter højeste værdi.

hvad vile værer den hurtigtste måde at gører det på? `
ville et array fx værer bedre/hurtigere/nemmere end det record jeg havde tænkt mig ?
Avatar billede stoney Nybegynder
04. september 2002 - 20:23 #1
procedure TForm1.Button1Click(Sender: TObject);
Var
MinList : Tstringlist;
Begin
MinList := Tstringlist.create;
MinList.loadfromfile('C:\Test.txt');
//minlist.Sorted := true; her sorteres listen
MinList.free;
end;

Stoney
Avatar billede stoney Nybegynder
04. september 2002 - 20:24 #2
glemte denne, hvis du ikke vil have flere af samme "værdier"

minlist.Duplicates := dupIgnore;

Stoney
Avatar billede atlanta Nybegynder
04. september 2002 - 20:49 #3
hmm tjoo.. det var ikke en dum ide.. bortset fra at jeg nok ikke var precis nok.. når jeg har læst min fil ind så skal jeg parse den altså.. finde ud af hvor mange bananer jeg har og hvor mange æbler hver for sig.. sådan mere som en database.. hvor jeg har en tabel med en 3 felter navn, antal bananer og antal pærer derefter skal læ likke alle forekomster af navn samme så det bliver til en forekomst med alle antal bananer og alle antal pærer. og så til sidst sorterer listen efter hvem der har flest antal bananer..

sådan. det var vidst lidt merer precis
Avatar billede stoney Nybegynder
04. september 2002 - 20:57 #4
Prøv lige at give et eks. på din .txt fil

Stoney
Avatar billede atlanta Nybegynder
04. september 2002 - 21:06 #5
ok kommer jeg lige med...

men jeg lavede lige lidt benchmark på  koden med stringlist og den første kove jeg kom med :D og der var pænt meget forskel :D

Stringlist:  0,000003009 sekunder
------------------------
Min:  0,030000089 sekunder

hmm det bedste eksempel på sådan en fil jeg egentlig kan komme med er en irc logfil..

mit problem likker ikke i at parse min fil men hvor jeg skal gemme de 4 ting jeg får ud af det når jeg parser den..
Avatar billede stoney Nybegynder
04. september 2002 - 21:08 #6
Jeg mente hvordan din txt fil ser ud.

bananer,1
pærer,4

eller hvad ?

Stoney
Avatar billede lanstorp Nybegynder
04. september 2002 - 21:12 #7
Er dine data opstillet i en kolonne lignende struktur adskilt af en separator kan du bruge noget af løsningen fra
http://www.eksperten.dk/spm/244229
Avatar billede atlanta Nybegynder
04. september 2002 - 21:14 #8
nej der kunne fx stå..

stoney bananer bananer pærer bananer pærer pærer
atlanta pærer pærer pærer pærer bananer

altså ikke noget specifikt.. men som sagt har jeg selv koden der regner ud hvor mange bananer og hvor manger pærer der er i hver linie

skal bare bruge noget at likke det ind i så det er nemt at likke alle referenver af stoney's bananer og pærer samme til en stor sum af pærer og bananer

og derefter sorterer efter hvem der har flest og så lave en lille txt fil med det
Avatar billede lanstorp Nybegynder
04. september 2002 - 21:21 #9
Det kan du også fixe af spm 244229.
Avatar billede atlanta Nybegynder
04. september 2002 - 21:23 #10
ja havde ikke lige set dit tag før.. jeg er i fuld gang med at tjekke det ud
Avatar billede atlanta Nybegynder
04. september 2002 - 22:10 #11
hmm nu er jeg endelig kommet igenne.. hehe der var jo film i tv så det gik jo kun med et ½ øje :D.. men borris kommer jo med 2 eksempler.. kan ikke lige afgører hvilke af dem der er hurtigt.. men kikker på dme imorgen,, måske er en af dem merer velegnet end den anden

måske for borris også kikket herind i morgen og selv kommentrer det :D
Avatar billede borrisholt Novice
05. september 2002 - 09:24 #12
kunne du ikke lave en record og vise den her så må vi jo finde en hurtig løsning !

Jens B
Avatar billede loke-liscom Nybegynder
05. september 2002 - 13:25 #13
Her er en måde.....

function IndlaesTextIString(txtfil : string) : string
var
  fil : file;
  tmp,tmp1 : string;
  xx : integer;
begin
  Tmp := '';
  AssignFile(fil,TxtFil);
  Reset(Fil,1);
  repeat
    SetLength(Tmp1,1000);
    BlockRead(fil,tmp1[1],1000,xx);
    SetLength(Tmp1,xx);
    Tmp := Tmp + Tmp1;
  until xx<1000;
  CloseFile(Fil);
  result := tmp;
end;

På denne måde får du det hele ind i en string så kan du bare begynde at bearbejde det med copy, delete, pos, osv....

/Klaus
Avatar billede atlanta Nybegynder
05. september 2002 - 16:33 #14
dar.. så gik ie ned.. havde ellers lige skrevet en halv roman :D :. nu er jeg kommet frem til at denne koder er hurtigst:

procedure TForm1.Button4Click(Sender: TObject);
var
f: File;
logfile: pchar;
logfilesize: integer;
begin
  tid := GetTickCount;
  AssignFile(f, 'fil.txt'); Reset(f, 1);
  logfilesize := FileSize(f);
  logfile := StrAlloc(logfilesize+1);
  blockread(f, logfile^, logfilesize);
  Closefile(f);
  strdispose(logfile);
end;

kunne det laves bedre ?
og lige nu likker al min txt jo i en lang plører.. så den vil værer temmelig besværlig at parse og det ville da værer noget af et loop :D..
+ jeg skal jo også til sidst når jeg er nået helt ned til efter parsing:
navn    x  y  z
---------------
loke 1 5 9
atlanta 10 55 66
stoney 75 2 4
stoney 5 10 2
atlanta 5 20 5

så skal det jo smækkes sammen til:

navn    x y  z
---------------
loke 1 5 9
atlanta 15 75 71
stoney 80 12 6

og der skal så bagefter sorteres efter højeste tal x:

navn    x y  z
---------------
stoney 80 12 6
atlanta 15 75 71
loke 1 5 9

og det skal gå stærk :D
Avatar billede atlanta Nybegynder
05. september 2002 - 16:42 #15
loke-liscom det der er prob med dit foreslag er at det ikke er hurtigt nok.. se her..

Loke-Liscoms ide:    90,000 ms
Loke-Liscoms ide:    90,000 ms
Loke-Liscoms ide:    90,000 ms
Loke-Liscoms ide:    90,000 ms
Loke-Liscoms ide:    90,000 ms
Loke-Liscoms ide:    80,000 ms
Min Ide:    50,000 ms
Min Ide:    60,000 ms
Min Ide:    60,000 ms
Min Ide:    60,000 ms
Min Ide:    60,000 ms
Avatar billede loke-liscom Nybegynder
05. september 2002 - 18:18 #16
Prøv at sætte blokstørrelsen op den tager jo kun 1000 bytes af gangen prøv med 10kb
eks. BlockRead(fil,tmp1[1],10240,xx);
Avatar billede loke-liscom Nybegynder
05. september 2002 - 18:18 #17
eller 1Mb
Avatar billede loke-liscom Nybegynder
05. september 2002 - 18:22 #18
sorry jeg læste ikke lige odrentligt efter..., det er da klart at din er hurtigst hvis du vil ha' det ind i en string så:

procedure TForm1.Button4Click(Sender: TObject);
var
f: File;
logfile: string;
logfilesize: integer;
begin
  tid := GetTickCount;
  AssignFile(f, 'fil.txt'); Reset(f, 1);
  logfilesize := FileSize(f);
  SetLength(LogFile,LogSize);
  blockread(f, logfile[1], logfilesize);
  Closefile(f);
  LogFile := '';
end;
Avatar billede atlanta Nybegynder
05. september 2002 - 20:56 #19
loke du er genial.. den du lige har givet er storset lige så hurtig.. men den du kom med som løsning til den anden .. hvis man sætter den for højt op går det bare langsommere og det hurtigste jeg kunne få den til var 80ms .. og de andre tar ca 60ms .. :D

Loke-Liscoms ide #2:    60,000 ms
Min Ide:    50,000 ms
Loke-Liscoms ide #2:    60,000 ms
Min Ide:    60,000 ms
Loke-Liscoms ide #2:    60,000 ms
Min Ide:    60,000 ms
Loke-Liscoms ide #2:    60,000 ms

og nu er det ikke PChar.. for lad os sige det ligeud.. mig og PChar = dårlig blanding :D
Avatar billede loke-liscom Nybegynder
06. september 2002 - 11:08 #20
Det er klart at din ide er den hurtigste, det kan ikke gøres hurtigere! Der er 2 måder at loade filer på, der er Windows API- og Delphis rutiner de er bare lige hurtige :) se http://www.eksperten.dk/spm/253332

Min 2. ide er det samme som din ide jeg putter bare dataen ind i en string. Da block størrelsen er den samme som filstørrelsen bliver hele filen loadet ind i stringen på éen gang. Det eneste problem er at du kan ikke lave en progressbar der viser hvor langt det er kommet med filen. PChar og string er nærmest det samme men når du bruger string holder Delphi styr på pointer ol. og det gør det meget lettere.

blockread(f, logfile[1], logfilesize);
//logfile[1] er en pointer til begyndelsen af strengen. eller til den første PChar.

Grunden til at første eks. er langsommere er at man heletiden loader lidt data og så kaster man det lidt rundt imellem nogle variabler og så gør man det hele igen.

Har du fået nok nu eller skal du også have nogle hurtige rutiner til at sortere dataen?
Avatar billede atlanta Nybegynder
06. september 2002 - 11:57 #21
hvis du kan lave en genial ide til at sortere min data som er parset fra stringen ned i et array.. så ville det værer perf.. kan sq ikke selv lige helt komme på en ide til at knække den. :/
min data likker som sagt i arrayet på den her måde:

navn    x y  z
---------------
loke 1 5 9
atlanta 15 75 71
stoney 80 12 6

og skal sorteres efter x

men med hensyn til at delphi holder styr på pointers og sådan.. gør det det ikke også en smule langsommere ?
Avatar billede loke-liscom Nybegynder
07. september 2002 - 20:38 #22
Delphi er vist reletiv god til at håndtere sine dynamiske typer, der er vist ikke den store foreskæl rent hastigheds messigt.

skal du udelukkende bruge dine data i hukommelsen eller skal de gæmmes efter de er sorteret i en ny struktureret fil?
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