如何逐行处理大型 CSV 文件?
How can I process a large CSV file line by line?
我已经成功编写了一个使用 cURL 下载 CSV 文件然后将 CSV 解析为数组的脚本,如下所示:
$rows = array_map(function($a) {
return str_getcsv($a, $delimiter);
}, explode("\n", $result));
然后我使用 foreach
遍历 $rows
将某些内容保存到数据库中。
脚本工作正常,但是当使用更大的 CSV 文件(>10.000 行)时,脚本变得相当慢并且会出现更多错误。
我想将 CSV 文件切成小块,这样就不会将整个文件导入到变量中。我找到了以下 solution,但它仍然一次处理整个文件。
有没有办法把CSV文件切块然后运行数据库函数多次?或者有没有更好的方法来处理像这样的大型 CSV 文件?
我对处理大文件比较陌生,所以请多多关照!
将文件保存在某处,然后像这样按块处理它:
<?php
$filePath = 'big.csv';
//How many rows to process in each batch
$limit = 100;
$fileHandle = fopen($filePath, "r");
if ($fileHandle === FALSE)
{
die('Error opening '.$filePath);
}
//Set up a variable to hold our current position in the file
$offset = 0;
while(!feof($fileHandle))
{
//Go to where we were when we ended the last batch
fseek($fileHandle, $offset);
$i = 0;
while (($currRow = fgetcsv($fileHandle)) !== FALSE)
{
$i++;
//Do something with the current row
print implode(', ', $currRow)."\n";
//If we hit our limit or are at the end of the file
if($i >= $limit)
{
//Update our current position in the file
$offset = ftell($fileHandle);
//Break out of the row processing loop
break;
}
}
}
//Close the file
fclose($fileHandle);
我已经成功编写了一个使用 cURL 下载 CSV 文件然后将 CSV 解析为数组的脚本,如下所示:
$rows = array_map(function($a) {
return str_getcsv($a, $delimiter);
}, explode("\n", $result));
然后我使用 foreach
遍历 $rows
将某些内容保存到数据库中。
脚本工作正常,但是当使用更大的 CSV 文件(>10.000 行)时,脚本变得相当慢并且会出现更多错误。
我想将 CSV 文件切成小块,这样就不会将整个文件导入到变量中。我找到了以下 solution,但它仍然一次处理整个文件。
有没有办法把CSV文件切块然后运行数据库函数多次?或者有没有更好的方法来处理像这样的大型 CSV 文件?
我对处理大文件比较陌生,所以请多多关照!
将文件保存在某处,然后像这样按块处理它:
<?php
$filePath = 'big.csv';
//How many rows to process in each batch
$limit = 100;
$fileHandle = fopen($filePath, "r");
if ($fileHandle === FALSE)
{
die('Error opening '.$filePath);
}
//Set up a variable to hold our current position in the file
$offset = 0;
while(!feof($fileHandle))
{
//Go to where we were when we ended the last batch
fseek($fileHandle, $offset);
$i = 0;
while (($currRow = fgetcsv($fileHandle)) !== FALSE)
{
$i++;
//Do something with the current row
print implode(', ', $currRow)."\n";
//If we hit our limit or are at the end of the file
if($i >= $limit)
{
//Update our current position in the file
$offset = ftell($fileHandle);
//Break out of the row processing loop
break;
}
}
}
//Close the file
fclose($fileHandle);