Я успешно написал скрипт, который загружает файл CSV с использованием cURL, а затем анализирует CSV в массив следующим образом:
$rows = array_map(function($a) {
return str_getcsv($a, $delimiter);
}, explode("\n", $result));
Затем я перебираю $rows
с помощью foreach
сохранить что-то в базе данных.
Сценарий работает нормально, но при использовании файла CSV большего размера (> 10.000 строк) сценарий становится довольно медленным и выдает гораздо больше ошибок.
Я хотел бы разрезать файл CSV на части, чтобы не весь файл был импортирован в переменную. Я нашел следующее решение, но это все еще обрабатывает весь файл сразу.
Есть ли способ разрезать 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);
Других решений пока нет …