Avatar billede runem74 Nybegynder
30. marts 2002 - 20:50 Der er 12 kommentarer og
1 løsning

segment af en tekst fil

Hej,

Jeg har en stor tekst fil hvorfra jeg ønsker et bestemt segment. Det jeg gør i øjeblikket er at søge filen igennem linie for linie til det som skal bruges bliver fundet. Mit spørgsmål er om ikke det er muligt at udtage tekst fra linie x til x+5 i filen (jeg håber at denne metode er hurtigere).

Mange hilsner,

Rune

Avatar billede stoney Nybegynder
30. marts 2002 - 21:12 #1
Sådan overfører du linie 2-3-4 fra memo1 til memo2.

du kan også bare overføre til en streng og søge i den

procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
startlinie: integer;
antallinier: integer;
begin
memo2.Clear;
startlinie := 2;
antallinier := 4 ;
for i := startlinie-1 to antallinier-1 do
memo2.Lines.Add(memo1.Lines[i]);
end;

Stoney
Avatar billede runem74 Nybegynder
30. marts 2002 - 21:18 #2
Undskyld, jeg har muligvis ikke formuleret mig præcis nok. Jeg ønsker et segment fra en tekst fil som er på min harddisk.
Avatar billede stoney Nybegynder
30. marts 2002 - 21:19 #3
jamen så indlæs den i memo1 eller i en stringlist

Stoney
Avatar billede runem74 Nybegynder
30. marts 2002 - 21:25 #4
Filen er meget stor og memo'er har begrænsninger har jeg fået fortalt.
Desuden ønsker jeg hurtig tilgang da det er tale om en virkelig stor fil.
Avatar billede stoney Nybegynder
30. marts 2002 - 21:27 #5
På win9x er begrænsningen 32 k.
NT4/2000/XP er begrænsningen 2 GB.

Hvor stor er din fil ?

Stoney
Avatar billede runem74 Nybegynder
30. marts 2002 - 21:35 #6
Filen er 300 mb så det kan godt lade sig gøre på din måde. Men jeg ønsker en hurtig metode da det er noget der skal gentages mange gange. Når man bruger append har man en fil pointer som er placeret på for enden af teksten filen. Hvis man nu kunne få den placeret inde midt i filen og der efter begynder at læse.
Avatar billede runem74 Nybegynder
30. marts 2002 - 21:36 #7
Men hvordan?
Avatar billede cms Nybegynder
30. marts 2002 - 22:59 #8
det er en tekstfil siger du... så er afstanden mellem hver linjeskift jo forskellig. så kan man i princippet ikke vide hvor linje 18.594 er, uden at søge hele filen igennem til man når det punkt.
Avatar billede laffe Nybegynder
30. marts 2002 - 23:46 #9
Læs hele filen igennem en gang, og led efter /n (linieskift).
Hver gang du finde et /n, så gemmer du fil-positionen i en struktur. Når du har læst hele filen igennem, så har du i pricippet lavet en slagt index-fil den oprindlige fil. Nu kan du bruge seek funktionen til at læse x+5 linier i filen.
Avatar billede doc404 Novice
31. marts 2002 - 04:08 #10
Hvis du skal indexerer dig i en sådan fil, så ville jeg nok vælge alle andre løsninger end at loade den i en TStringList eller lignende.. Vi taler 300MB og du vil få et swap helvede...

Ideen med at gennemlæse filen og finde pointere til alle linierne er bedre, men du ender stadig op med en array på cirka 4000000 items, hvis vi antager at du har en gennemsnitlig linielængde på 80...

Hvis du ikke vil smide det over i en database og udnytte at sådan noget er en db nu en gang god til, så kunne man danne en ny fil med en fast linie længde - som du så kan indexere i. Men det kommer igen an på hvilke slags data, der ligger i filen.
Avatar billede runem74 Nybegynder
31. marts 2002 - 11:01 #11
Jeg har kun delphi personal så jeg har ikke så mange database komponenter.
Jeg kan ikke bruge de frie version da programmet en dag skal publiceres.

Hvis jeg nu fylder linierne ud med space så at de bliver lige lange hvordan får jeg så pointeren placeret ved fx. linie 3000?

Jeg accepter svaret men du vil måske dele med laffe da dit svar er en udvidelse af hans.

Rune
Avatar billede doc404 Novice
31. marts 2002 - 11:24 #12
Hvis du benytter en TFileStream kan du gøre noget i denne stil

const
  LineLength = 80;

var
  fs : TFileStream;
  Buf : array[0..LineLength] of char;
begin
  fs := TFileStream.Create('c:\filename',fmOpenRead);

  fs.Seek(3000*LineLength,soFromBeginning);

  FillChar(Buf,SizeOf(Buf),0);
  fs.Read(Buf,10);
  ShowMessage(Buf);
  fs.Free;
end;

NB : hvis første linie hedder 1 skal du bruge (3000-1) * LineLength

Lad os alle dele ;-)
Avatar billede runem74 Nybegynder
31. marts 2002 - 11:51 #13
Mange tak.
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