2013-08-20 41 views
-2

我试图从文本文件的最后一行拉出特定位数据,以便能够自行显示它。例如,我想拉降雨数据了以下文件:使用PHP从文本文件中的最后一行提取数据

#date #time #blah #rainfall #blah #blah 
200813 1234 1234 0.5  1234 1234 
200813 1235 1234 1.2  1234 1234 
200813 1236 1234 3.5  1234 1234 
200813 1237 1234 0.2  1234 1234 
200813 1238 1234 0.1  1234 1234 

而且我想用数据以这种方式在网页上:

降雨预测,现在为0.1mm

所以我需要的是最后一行的0.1个数字。由于该文件是远程文件,并且在文件底部添加了新行,所以我只需要最后一行。

有人可以请帮忙,我一直在为这些日子绞尽脑汁。

+3

请在做出新问题前使用搜索,重复[PHP - 返回文件的最后一行?](http://stackoverflow.com/questions/1062716/php-returning-the-last-line-在文件中)也有这个[从文件​​读取最后一行](http://stackoverflow.com/questions/1510141/read-last-line-from-file) – Prix

+0

请确实阅读我的问题之前建议thouroughly相关性很远的话题。我已经搜索过,没有人告诉我如何从一行中的某个位置到一行中的位置选择文本。由于数据总是会改变,我假设我必须选择该行的一部分。例如,我无法将数据与if语句匹配,因为数据永远不会相同。 – ArnoldJRimmer

+0

然后请阅读我上面提到的两个链接,它们会回答你如何获得最后一行的问题。一旦你知道如何得到最后一行是一个爆炸变量的问题。 – Prix

回答

0

它通常与一个班轮做,如果文件不是太大,或者接近一个:

vprintf(
    'Rainfall prediced now: %4$smm' 
    , explode(' ', end((
     file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) 
    ))) 
); 

如果输入格式比较复杂,也可以用sscanfpreg_match解析最后一行。

编辑当你写文件很小,你也可以将其加载到一个字符串(file_get_contents),并分析从后面那个字符串:

$buffer = '#date #time #blah #rainfall #blah #blah 
200813 1234 1234 0.5  1234 1234 
200813 1235 1234 1.2  1234 1234 
200813 1236 1234 3.5  1234 1234 
200813 1237 1234 0.2  1234 1234 
200813 1238 1234 0.1  1234 1234'; 

preg_match('/([^ ]+)\s+\d+\s+\d+\R?$/', $buffer, $matches) 
    && vprintf('Rainfall prediced now: %2$smm', $matches); 

// prints "Rainfall prediced now: 0.1mm" 
+0

文件永远不会超过700条短行,所以可以立即加载好。现在我会放弃这个谢谢。 – ArnoldJRimmer

+0

谢谢Hakre,完成这项工作。现在,我可以花更多的时间更有效地处理这个小问题!再一次感谢你! – ArnoldJRimmer

+0

PS这是第一个为我工作的片段。 – ArnoldJRimmer

0
$file = file('path/to/file'); 
$lastLine = end($file); 

应该做你所需要的。

或者,如果你是一个衬垫的粉丝: -

$lastLine = end(file('path/to/file')); 

这将输出你的预期降雨假设你的文件被称为 'data.txt中': -

printf('Rainfall expected %smm', array_values(array_filter(explode(' ', end(file('data.txt')))))[3]); 

file()end()

+0

谢谢你为此,我已经使用Hakres解决方案,但它看起来像这样做也完美的工作。再次感谢。 – ArnoldJRimmer

0

如果您使用的是基于Unix的系统,考虑使用tail命令。

$file = escapeshellarg($file); 
$line = `tail -n 1 $file`; 

下面的工作,太:

$fp = fopen('file.txt', 'r'); 
$pos = -1; $line = ''; $c = ''; 
do { 
    $line = $c . $line; 
    fseek($fp, $pos--, SEEK_END); 
    $c = fgetc($fp); 
} while ($c != PHP_EOL); 

echo $line; //last line 

fclose($fp); 

如前所述here,这不加载整个文件到内存中,并很快。

希望这会有所帮助!

+0

嗨,我试了第二个代码,并得到这个“流不支持在/ public_html/..”我会尝试现在的第一个代码。 – ArnoldJRimmer

相关问题