处理限制为一行的大型csv文件

时间:2014-09-28 04:03:48

标签: php csv

因此,在遇到内存限制后,我复制了the following code

效果很好。我现在唯一的问题是在处理csv文件的情况下,结构限制基于块的大小,但这意味着它可能会在中途切断一行。

我可以做些什么来确保何时制作一个块,它最终会到/ n。

2 个答案:

答案 0 :(得分: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
) 

答案 1 :(得分: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行数