Chris wrote:
Daniel Tryba <ne************ ****@canopus.nl > wrote in message news:<bt******* ***@news.tue.nl >... Chris <cm*@raindrop.c o.uk> wrote: I need to read a txt file backwords line by line. Can anybody help me do
this.
Use file(). It returns an array which you can read from count($array)-1
to 0.
Is their a way of doing this without reading the whole file into
memory as it could potentially be a large file?
In this case, I would recommend something like the following (ghastly) mix of
code and pseudocode :o). I haven't tested it, so there may be a logic error -
don't treat is as gospel. Basically, you open the file and read it chunk by
chunk backwards (that is, the chunks start at the end and move towards the
beginning of the file. Each individual chunk is read forwards). Make each
chunk into an array. Unless you're reading from the beginning of the file,
remember how big the first record is and then kill it, as it's likely
incomplete. During the next loop, adjust your fseek to compensate for each
previous killed record. Then read through the array backwards and do whatever
it is you want to the records. Remember, it's good practice not to loop through
the whole thing if you don't need to. In other words, use "break" and
"continue" as appropriate.
fopen(); //open file
$intChunkSize = 5 * 1024; //set chunk size to bigger than max record size
$intAdjustment = 0;
$intSeekTo = 1;
loop //loop while $intSeekTo > 0
$intSeekTo = filesize() - ($intChunkSize * $intLoopNumber) + $intAdjustment;
if ($intSeekTo < 0){
$intChunkSize += intSeekTo; //adjust your chunk size to bytes remaining
$intSeekTo = 0;
}
fseek(); //fseek to $intSeekTo
fread(); //read $intChunkSize bytes from file
$arrFoo = split("\n", fread()); //read up to intChunksize bytes into array
$intAdjustment += strlen($arrFoo[0]); //remember how much to adjust
if ($intSeekTo > 0) //if this isn't the last loop
array_shift($ar rFoo); //kill the first (incomplete) record
for ($i = count($arrFoo)-1; $i >= 0; ++$i) //loop through array backwards
//do your thing
end loop
Regards,
Shawn
--
Shawn Wilson
sh***@glassgian t.com http://www.glassgiant.com