2012-08-10 137 views
0

我正在做一個CSV上傳,其中有35,000行內容正在進行,我試圖想到一種方法來開始解析CSV文件的行「X 」。我一直刷新頁面並保存每次最後一行,以便修復瀏覽器遇到的超時問題。現在,我只需要知道如何在我離開的那條線上啓動我的CSV文件。在線解析CSV文件「X」

while(($data = fgetcsv($handle, 0, ",")) !== false) { 
    if($i > 2000) { break; } 
    //start parsing here 
    $i++ 
} 
$_SESSION['lastLine'] = $i; 
$_SESSION['filepath'] = $filepath; 
//resend headers 

我將文件路徑保存爲會話,因爲它已上傳到臨時文件夾,我可以重新訪問它。所以我第一次上傳時,我完全滿意地欣賞了所有2000線。標題重置並重新啓動該過程,但由於$ _SESSION ['lastline']現在是2001年,代碼中斷(這很好)。我需要弄清楚的是,我怎樣才能開始我在2001年的解析並在4000年再次破解。這將持續到所有35,000行完成。

我在想設置break語句解析前,說:

if($i < $_SESSION['lastLine']) { $i++; } 
if($i > $_SESSION['lastLine'] + 2000) { break; } 

我的問題是,這樣做35000線CSV意味着最後的10個左右的運行,將不得不做的我++循環數千甚至在分析甚至開始之前。我四處尋找一些方法來在「X」行開始CSV文件,這將是我的首選方法,但我找不到任何東西。任何幫助都是極好的。

+0

只是設置爲會話不僅最後一行索引,但緩衝區大小(2000),並在循環中使用它作爲行的最大值 – tijs 2012-08-10 14:48:38

回答

1

使用ftell()來保存您在文件中的位置。然後,在重新啓動fgetcsv()循環之前,您可以將fseek()移動到該位置,例如

while($row = fgetcsv($handle)) { 
    $cur_pos = ftell($handle); 
    if ($some_condition) { 
      break; 
    } 
} 
..... 

fseek($handle, $cur_pos); // jump back to last position 
... continue on wards ... 
+0

標記您的答案是最好的幾個,但不幸的是我用我的選擇(它的工作),因爲我需要一個半小時內快速修補的問題。非常感謝您的回覆,當我有第二次回到這個客戶時,我會用你的想法,因爲我確信它比我的效率高10倍。 – lxndr 2012-08-10 15:09:42

+0

對於其他我讀過這個有用的解決方案的人: 1)函數是fgetcsv(不是fetgetcsv,如第一行所示) 2)PHP手冊警告:「某些文件系統函數可能會返回大於2GB的文件的意外結果「見http://php.net/manual/en/function.ftell.php – globalSchmidt 2014-08-24 21:38:48

+0

我認爲它是[fgetcsv](http://php.net/manual/en/function.fgetcsv.php)而不是'fetgetcsv '。 – 2015-12-05 16:37:26

0

您應該保存字節隨着行號偏移,則fseek到字節開始解析前偏移。

0

正如我發現FSEEK被抵消,而不是線 字符,我使用SplFileObject

像這樣

$file = new SplFileObject('your-csv-file.csv'); 
//this is zero based so need to subtract 1 
$file->seek(2); /// Going to line 3 
$arr=$file->fgetcsv(); 
print_r($arr); 

若要從行號

while(!$file->eof()) 
{ 
    $row=$file->fgetcsv(); 
    print_r($row); 
} 

函數迭代整個CSV鏈接: - seekfgetcsv