Php 处理限制为一行的大型csv文件
因此,在遇到内存限制后,我复制了 效果很好。我现在唯一的问题是在处理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))
我可以做些什么来确保在创建块时,它最终达到/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;
}
?>