2013-08-02 139 views
3

我有一組文本文件,文件大小非常大。 我不想讀取整個文件。我只對以** DATA IMP開頭並以** DATA END結尾的塊感興趣。此塊之間的任何數據對我來說都很重要。PHP從大文本文件中讀取特定行600MB文件

然而這個塊可以出現在開始文件的,在之間的文本文件。 我希望這個閱讀過程快速。讓我們說,如果它是在文本文件的開始處,它應該像linux一樣快 - 這對大文件來說花費的時間非常短。

什麼是讀取這些大文件的最佳方式,所以一旦我得到這個塊,我不必讀取文件,直到結束?

文件內容示例:(600 MB或更大)

Dummy text 
Dummy text 
Dummy text 
Dummy text 
** DATA IMP 
** d 
** e 
** f 
** g 
** DATA END 
Dummy text 
Dummy text 
Dummy text 
AND SO ON ... 

編輯: * OK.I我假設的數據是在文件的頂部,因爲我沒有其他選擇。 * 文件內容示例:(600 MB或更大)

** DATA IMP 
** d 
** e 
** f 
** g 
** DATA END 
Dummy text 
Dummy text 
Dummy text 
Dummy text 
Dummy text 
Dummy text 
AND SO ON ... 
+1

我想要中獎彩票號碼,但這並不能實現。您將需要掃描整個文件,直到達到DATA END。可能的方法是讀取每行或grepping。 Head不會幫助你,因爲它只顯示文件的頂部x行而不考慮內容 – Anigel

+0

好的。任何可能最快的php解決方案都是受歡迎的。我在windows上無法使用grep。 – django

+0

增加php服務器執行時間 –

回答

0

只要文件不在索引,數據庫或類似的,你必須要經過整個文件,直到找到** DATA IMP東西。

另一種選擇是,如果該文本是在某個你不是的位置。

如果要提取文本:

$file = new SplFileObject("file.txt"); 

$lines = array(); 

while (!$file->eof()) 
{ 
    $line = $file->fgets(); 

    if ($line === '** DATA IMP') 
    break; 
} 

$line = $file->fgets(); 

while($line != '** DATA END') 
{ 
    $lines[] = $line; 
    $line = $file->fgets(); 
} 
+0

讓我們假設數據是在文件的開始?然後怎樣呢 ?如果我沒有其他選擇,我也可以讓這些數據出現在文件頂部。 – django

+0

@django我改變了我的回答 –

2

使用SplFileObject類。

首先使用SplFileObject ::與fgets到:

Returns a string containing the next line from the file, or FALSE on error. 

像這樣的事情

$file = new SplFileObject("file.txt"); 
while (!$file->eof()) { 
    $line = $file->fgets(); 
    if ($line === 'needle') break; 
} 

然後你可以使用$counter變量哪個行包含你的針的參考。之後,它非常微不足道的獲取你想要的信息。想要檢索該行?或之後的整個文件?或之前呢?去這裏,使用SplFileObject靜態函數來完成你需要做的任何事情。

+0

+1,因爲SplFileObject實際上有一個方法來獲得一個特定的行:http://php.net/manual/en/splfileobject.seek.php – AVProgrammer

0

你有沒有嘗試過這樣的:

<?php 
    $raw = shell_exec('grep \'\*\*\' /path/to/file'); 
    var_dump($raw); 
?> 

不好意思,剛纔注意到一個評論,你是在Windows上。我猜想必須有一個Windows版本grep,這可能是值得研究的。

0

我想我將不得不依賴像grep linux(針對windows gnu32) 這樣的外部工具來滿足我的特定需求,因爲根據我的理解,在php上有更好的性能。

如果您不同意,請添加評論。

+0

它可以工作,如果文件被新線。如果沒有新行,它只會轉儲整個文件。順便說一句,我同意,grep更快。 – imel96

+0

我有數據換行 – django

+0

看看這個SO線程然後:http://stackoverflow.com/questions/87350/what-are-good-grep-tools-for-windows – Tigger

0

grep的一個Windows equivlant是findstr:

搜索文件中的字符串。

findstr