By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
425,478 Members | 1,833 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 425,478 IT Pros & Developers. It's quick & easy.

How do i read a file line by line backwards?

P: n/a
Can anybody help.

I need to read a txt file backwords line by line. Can anybody help me do
this.

Thanks
Chris
Jul 17 '05 #1
Share this Question
Share on Google+
8 Replies


P: n/a
Chris <cm*@raindrop.co.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.

--

Daniel Tryba

Jul 17 '05 #2

P: n/a
On Mon, 05 Jan 2004 15:17:47 -0800, Chris wrote:
Can anybody help.

I need to read a txt file backwords line by line. Can anybody help me do
this.

Thanks
Chris

$foo = @file('foo.php');
$bar = array_reverse($foo);

foreach ($foo as $baz) {
print $baz . "\n";
}
HTH =)

Regards,

Ian

--
Ian.H [Design & Development]
digiServ Network - Web solutions
www.digiserv.net | irc.digiserv.net | forum.digiserv.net
Programming, Web design, development & hosting.

Jul 17 '05 #3

P: n/a
You can also use function *array_reverse* to reverse the array, after
calling *file*. But dont do this unnecessarily as it will put extra
load on the server.

You can even reverse a string using following code:

$str = implode("",array_reverse(preg_split('//', $str)));

--
Rahul

Daniel Tryba <ne****************@canopus.nl> wrote in message news:<bt**********@news.tue.nl>...
Chris <cm*@raindrop.co.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.

Jul 17 '05 #4

P: n/a
jn

"Ian.H" <ia*@WINDOZEdigiserv.net> wrote in message
news:pa***************************@hybris.digiserv .net...
On Mon, 05 Jan 2004 15:17:47 -0800, Chris wrote:
Can anybody help.

I need to read a txt file backwords line by line. Can anybody help me do
this.

Thanks
Chris

$foo = @file('foo.php');
$bar = array_reverse($foo);

foreach ($foo as $baz) {
print $baz . "\n";
}
HTH =)

Regards,

Ian

--
Ian.H [Design & Development]
digiServ Network - Web solutions
www.digiserv.net | irc.digiserv.net | forum.digiserv.net
Programming, Web design, development & hosting.


That should be:

foreach ($bar as $baz) {
print $baz . "\n";
}

Jul 17 '05 #5

P: n/a
Daniel Tryba <ne****************@canopus.nl> wrote in message news:<bt**********@news.tue.nl>...
Chris <cm*@raindrop.co.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?

thanks
chris
Jul 17 '05 #6

P: n/a
Chris wrote:

Daniel Tryba <ne****************@canopus.nl> wrote in message news:<bt**********@news.tue.nl>...
Chris <cm*@raindrop.co.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($arrFoo); //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***@glassgiant.com
http://www.glassgiant.com
Jul 17 '05 #7

P: n/a
"Chris" <cm*@raindrop.co.uk> wrote in message
news:bb**************************@posting.google.c om...
Can anybody help.

I need to read a txt file backwords line by line. Can anybody help me do
this.

Thanks
Chris

This is just a thought,

why not just open the file, seek to the end, read byte by byte backwords,
untill you find a \n

then what you have read in is a line,

repeat for next line,

repeat for next line,

repeat for next line,

--
Mike Bradley
http://www.gzentools.com -- free online php tools
Jul 17 '05 #8

P: n/a
Chris wrote:
Can anybody help.

I need to read a txt file backwords line by line. Can anybody help me do
this.


Are you on Linux? If so:

$file = popen("tac $filename",'r');
while ($line = fgets($file,8096) {
echo $line;
}

tac == cat backwards (lame joke but there you go)

Jul 17 '05 #9

This discussion thread is closed

Replies have been disabled for this discussion.