2010-08-25 66 views
3

感謝您抽出寶貴時間閱讀本文,我將很感激每一個迴應,但不管內容的質量如何。 :)PHP抓取txt文件中的最後15行

使用PHP,我試圖獲取文本文檔(.txt)的最後15行,並將該數據存儲到一個PHP變量。我知道這是可能的,但是當我得到最後15行時,是否有可能保留訂單?例如:

文本文檔:

A 
B 
C 

當我抓住從最後的15個字符的文本文檔,我不想回聲落得這樣的:

C 
B 
A 

所有援助非常感謝,我期待着您的回覆;謝謝。 :)如果我沒有清楚解釋任何內容,或者您​​希望我更詳細地解釋,請回復。 :)

謝謝。

+0

我出closevotes的和過於勞累熬夜35分鐘,但無論如何:可能重複[PHP如何只讀5 txt文件的最後一行(http://stackoverflow.com/問題/ 2961618/php-how-to-read-only-5-last-line-of-txt-file) – Gordon 2010-08-25 23:24:40

+0

另一個http://stackoverflow.com/questions/514673/how-do-i-open -a-file-from-line -x-to-line -y-in-php – Gordon 2010-08-25 23:32:40

回答

9

嘗試使用array_slice,它將返回一個部分的數組。在你想這種情況下,它返回的最後15行排列的,所以:

$filearray = file("filename"); 
$lastfifteenlines = array_slice($filearray,-15); 
+0

嗨,鮑勃·巴德利,感謝你的迴應以及你的努力。我非常感謝它。 ;)當我試圖回顯$ lastfifteenlines時,它似乎只顯示文本「數組」,當然,我敢肯定,這是我的錯誤和我缺乏的PHP知識。再次感謝您的迴應和努力。 ;) – AUllah1 2010-08-26 12:56:49

+0

'echo'而不是'implode(「\ n」,$ lastfifteenlines)''。 – Hammerite 2010-08-26 13:01:18

+0

嗨Hammerite,謝謝你的迴應。我非常感謝,使用這段代碼甚至允許我以正確的順序分配變量。感謝回覆以及努力。 ;) – AUllah1 2010-08-26 13:39:51

1

如果文件大於可用內存,你可以做到這一點並不大:

$fArray = file("filename"); 
$len = sizeof($fArray); 
for($i=$len -15;$i<$len ;$i++) 
{ 
    echo $fArray[$i]; 
} 

如果你有一個文件,該文件是百兆:

$rc = fopen("file","r"); 
for ($i=0; $line = fgets($file) ;$i++) 
{ 
    if ($i%15 == 0) 
    { 
     $last15 = array(); 
    } 
    $last15[] = $line; 
} 

echo join("\n",$last15); 

+1

當然,如果文件中的行數是15的倍數,那麼第二個只能工作。如果有20行(編號爲0到19),那麼你只能回到最後5行。 – Hammerite 2010-08-25 23:25:48

+0

@hammerite你是對的... – 2010-08-26 03:35:15

+0

嗨拜倫惠特洛克,感謝你的迴應,我非常感謝它。 :)儘管一件小事,在閱讀了txt文檔的最後15行後,我希望能夠給每個文本分配自己的php變量。但是,當我這樣做時,它會抓取最後一行中的數據,所以我無法爲上面的行添加任何變量。有沒有辦法做到這一點?對這個問題抱歉,尤其是因爲它似乎有點偏離主題。再次感謝您的迴應。 ;) – AUllah1 2010-08-26 12:34:55

2

可以使用fseek用否定的態度,通過文件向後尋找,當您去計算換行。

我太累了,無法撰寫複製/過去的代碼,但在fseek的手冊頁的註釋中有一些例子非常接近您想要的。

5

如果你不介意加載整個文件到內存:

$lines = array_slice(file('test.txt'), -15); 
print_r($lines); 

如果文件過大而無法裝入內存,你可以使用一個圓形的方法:

// Read the last $num lines from stream $fp 
function read_last_lines($fp, $num) 
{ 
    $idx = 0; 

    $lines = array(); 
    while(($line = fgets($fp))) 
    { 
     $lines[$idx] = $line; 
     $idx = ($idx + 1) % $num; 
    } 

    $p1 = array_slice($lines, $idx); 
    $p2 = array_slice($lines, 0, $idx); 
    $ordered_lines = array_merge($p1, $p2); 

    return $ordered_lines; 
} 

// Open the file and read the last 15 lines 
$fp = fopen('test.txt', 'r'); 
$lines = read_last_lines($fp, 15); 
fclose($fp); 

// Output array 
print_r($lines); 

這種方法如果文件少於15行,也將工作 - 返回一個數組,但文件中有很多行。

+0

嘿大衛丘吉爾,謝謝你的迴應和努力。我非常感謝它,不能夠感謝你。 ;) – AUllah1 2010-08-26 17:07:52

1

較長陣列的解決方案: array_slice(explode("\n",file_get_contents($file)),-15);

較短陣列溶液: array_slice(file($file),-15);

+0

嗨,我非常感謝你的回覆!我並不是真的太熟悉PHP,儘管我知道這是一個問題,我不太喜歡數組。只要我能夠爲數組內容分配一個php變量,我不介意使用數組?如果可能的話。無論如何,我非常感謝您的回覆以及您的時間和精力。 ;) 謝謝。 – AUllah1 2010-08-26 12:54:40

1

此代碼將打開文件,顯示總線,示出文件的報頭,並顯示文件的最後幾行在$ limit中定義。

<?php 
// open the file in read mode 
$file = new SplFileObject('file.csv', 'r'); 

// get the total lines 
$file->seek(PHP_INT_MAX); 
$last_line = $file->key(); 
echo $last_line; 
echo "<br>"; 

// Rewind to first line to get header 
$file->rewind(); 

// Output first line if you need use the header to make something 
echo $file->current(); 
echo "<br>"; 

// selecting the limit 
$limit = 6; 

// selecting the last lines using the $limit 
$lines = new LimitIterator($file, $last_line - $limit, $last_line); 

//print all the last 6 lines array 
//print_r(iterator_to_array($lines)); 
//echo "<br>"; 

// Loop over whole file to use a single line 
foreach ($lines as $line) { 

    print_r($line); 
    echo "<br>"; 

} 
+0

請添加一些說明來解釋添加的說明 – jjj 2017-09-26 14:41:44

+1

說明。 – 2017-09-27 14:59:50