2013-08-20 39 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

相關問題