-2

我正在尝试从文本文件的最后一行中提取特定的数据位,以便能够自己显示它。例如,我想从以下文件中提取降雨数据:

#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 数字。由于文件是远程文件,并且在文件底部添加了新行,因此我只需要最后一行。

有人可以帮忙吗,这几天我一直在绞尽脑汁。

4

3 回答 3

2
$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()

于 2013-08-20T16:47:24.323 回答
0

如果文件不是太大或接近一个,通常使用单行完成:

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

如果输入格式比较复杂,也可以使用sscanforpreg_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"
于 2013-08-20T16:51:11.183 回答
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); 

如前所述,不会将整个文件加载到内存中,而且速度很快。

希望这可以帮助!

于 2013-08-20T16:56:17.720 回答