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

Php 处理限制为一行的大型csv文件,php,csv,Php,Csv,因此,在遇到内存限制后,我复制了 效果很好。我现在唯一的问题是在处理csv文件的上下文中,结构限制基于块的大小,但这意味着它可以在中间剪切一行 我可以做些什么来确保在创建块时,它最终达到/n。您可以首先尝试使用以下设置内存限制: ini_set('memory_limit', '32MB'); 然后,要立即阅读一行: $handle = fopen("inputfile.csv", "r"); if ($handle) { while (($line = fgets($handle))

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

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


我可以做些什么来确保在创建块时,它最终达到/n。

您可以首先尝试使用以下设置内存限制:

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\u size参数不再需要了。。。因此,如果需要,可以将其删除

您还可以使用此功能逐行读取sav文件:

fgetcsv(file,length,separator,enclosure);
例1

<?php
$file = fopen("contacts.csv","r");
print_r(fgetcsv($file));
fclose($file);
?>
上述代码的输出将为:

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

我很想知道别人做什么

我将限制改为基于一定数量的行来读取,而不是大小限制。我没有使用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行数

,当遇到最后一行时,只需保留最后一行的内容,并在处理该行时将其添加到下一块的前面。当没有更多的块时,只处理最后一行。这很有趣。。。我们几乎在同一时间得到了相同的答案(间隔4分钟)。。。除了这段时间!费奥夫。。。按照fgets php手册中的规定,这是不需要的。。。我想把它加上去,但后来又查了一下,以确定它是否需要。让我们看看其他人会想出什么!我仍然在回顾我的改变,因为它并没有完全按照我的想法去做。我希望指定读取x行的数量,但目前似乎没有这样做。我很好奇为什么在每行处理行时会限制行的数量,所以您需要确保每行的可用内存不会太大。。。最后我很确定op想要处理整个文件不是吗?
<?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;
}

?>