2014-09-28 23 views
0

所以在遇到內存限制後,我複製了the following code處理限制爲一行的大csv文件

它工作得很好。我現在唯一的問題是在處理csv文件的情況下,結構限制基於塊的大小,但這意味着它可能會在中途切斷一行。

我能做些什麼來確保何時創建一個塊,它最終到達/ n。

+0

當你正在處理的塊中的行,當你遇到的最後一行,只要執着於的內容最後一行並將其添加到下一個塊的前面,以便處理該行。當沒有更多的塊時,只處理最後一行。 – 2014-09-28 04:13:33

回答

0

你可以先嚐試設置內存限制:

ini_set('memory_limit', '32MB'); 

之後,在一次讀取一行:

$handle = fopen("inputfile.csv", "r"); 
if ($handle) { 
    while (($line = fgets($handle)) !== false) { 
     // process the line read. 
    } 
} else { 
    // error opening the file. 
} 
fclose($handle); 

基於您的代碼示例,這將給:

function file_get_contents_chunked($file,$chunk_size,$callback) 
{ 
    $handle = fopen($file, "r"); 
    $i = 0; 
    if ($handle) { 
     while (($line = fgets($handle)) !== false) { 
      call_user_func_array($callback,array($line,&$handle,$i)); 
      $i++; 
     } 
    } else { 
     return false; 
    } 
    fclose($handle); 
    return true; 
} 

請注意,$ chunk_size參數不再需要了...因此,如果需要,可以將其刪除。

也可以使用該功能來讀取由線SAV文件行:

fgetcsv(file,length,separator,enclosure); 

實施例1

<?php 
$file = fopen("contacts.csv","r"); 
print_r(fgetcsv($file)); 
fclose($file); 
?> 

CSV文件:

Kai Jim, Refsnes, Stavanger, Norway 
Hege, Refsnes, Stavanger, Norway 

的輸出以上代碼將爲:

Array 
(
[0] => Kai Jim 
[1] => Refsnes 
[2] => Stavanger 
[3] => Norway 
) 
0

我很想知道別人在做什麼。

我改變了限制,以基於一定數量的行來讀取,而不是大小限制。我沒有使用fread,而是使用fgets來獲得整條線。 再次,這一切都來自問題中鏈接的代碼。

<?php 
function file_get_contents_chunked($file,$chunk_size,$callback) 
{ 
    try 
    { 
     $handle = fopen($file, "r"); 
     $i = 0; 
     $x = 0; 

     $chunk = array(); 
     while (!feof($handle)) { 
      while ($row = fgets($handle)) { 
       // can parse further $row by usingstr_getcsv 
       $x ++; 
       $chunk[] = $row; 
       if ($x == $chunk_size) {   
        call_user_func_array($callback, array($chunk, &$handle, $i)); 
        unset($chunk); 
        $x = 0; 
       }   
      } 
     } 
     fclose($handle); 
    } 
    catch(Exception $e) 
    { 
     trigger_error("file_get_contents_chunked::" . $e->getMessage(),E_USER_NOTICE); 
     return false; 
    } 
    return true; 
} 

?> 

//修正了我的實際意圖,限制通過線的X量

+1

其有趣......我們最終在同一時間得到了相同的答案(4分鐘的差距)......除了一會兒! feof ...這是不需要的fgets php手冊中指定的...我想添加它,但後來查找它,以確定是否需要它。讓我們看看別人會想出什麼! – Graben 2014-09-28 04:45:52

+0

我仍然在審查我的更改,因爲它沒有按照我的想法去做。我希望指定閱讀x行數量,但目前似乎沒有這樣做。 – Pat 2014-09-28 04:51:29

+0

我很好奇,爲什麼你會限制線的數量,因爲他們每行處理線,所以你需要確保每條線對於可用內存來說都不是太大......最後,我很確定op想讓整個文件處理不了? – Graben 2014-09-28 15:00:50