webForumDet fria alternativet

Börja läsa textfil efter ett visst antal rader

PHP

5 svar · 335 visningar · startad av oskob

Medlem sedan maj 20021 558 inlägg
Frågan#1

Hejsan!
Jag har en stor fet textfil som jag försöker spara information ur.
Problemet jag har nu är att jag inte vill ha med ett antal rader från filen i början. Eftersom filen uppdateras hela tiden kan jag inte ta bort dem manuelt.
Jag funderade på sätt som att man gör en if-sats som bara loopat fgets ett antal gånger tills den har kommit förbi raderna men det verkar vara väldigt knöligt och resurskrävande. Finns det några mindre idiotiska sätt?
Tack på förhand!

Medlem sedan jan. 20021 122 inlägg
#2

Om du vet hur dessa första rader ser ut kan du använda fseek för att hoppa över de x bytes som sidhuvudet består av. Annars kan du ju när du öppnar filen skutta ner ett par rader som du säger, särskilt resurskrävande borde det inte bli.

Medlem sedan maj 20021 558 inlägg
#3

Det låter intressant men hur gär man? :)
Jag vet inte exakt hur de ser ut men de är ju uppbyggda på ett speciellt sätt och delar av raderna ser alltid likadana ut så det går kanske att lösa med substr och sånt.
Men utveckla gärna! :)

R:
Och en till sak vad betyder siffrorna i "$data = fgets($fp, 4096);"?

Medlem sedan jan. 20021 122 inlägg
#4

Att den läser in till den 4096e byten, eller radbrytning. Om du vet att sidhuvudet alltid har detta utseende:

Date:xxxx-xx-xx
Time:xx.xx

Så kan du skippa de första 29 bytsen såhär:

$minfil = fopen("filen.txt", "r");
fseek($minfil, 29);
while($content = fgets($minfil, 4096)) {
 print $content;
}
Medlem sedan maj 20021 558 inlägg
#5

Men att skippa 4096 byte är väl ganska mycket?
Jaja...
Nu har jag i alla fall löst det som så med textfilen att jag laddar in den i en $ och sen rensar den på all onödig data som ligger före och efter det jag ska ha.
Nu är det dock så att jag har gjort en kodsnutt som loopar igenom den biten och den är gjord för att hantera en textfil. Alltså den går igenom den rad för rad. Nu blir det ju annorlunda efter som den ligger i en $. Finns det någon motsvarighet för fgets för att söka igenom strängar "rad för rad". Eller ska man exploada den in i en array? Blir en fasansfullt stor array det men det kanske inte gör så mycket?

Medlem sedan jan. 20021 122 inlägg
#6

Datamängden är den samma, vare sig du lagrar den i en sträng eller en sträng-array. Explode är nog lättast om du ska göra på det sättet.
I min kodsnutt ovan så skippar jag 29 bytes, eftersom mitt exempel på sidhuvud var så stort. Därefter lagrar jag de kommande 4096 bytes, ELLER fram till nästa radbrytning, i variabeln $content och skriver ut dem, och loopar på så sätt igenom filen.

319 ms totalt · 4 externa anrop · v20260731065814-full.2d97a731
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
190 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)