Как можно построчно обрабатывать большой файл CSV?

Я успешно написал скрипт, который загружает файл CSV с использованием cURL, а затем анализирует CSV в массив следующим образом:

$rows = array_map(function($a) {
return str_getcsv($a, $delimiter);
}, explode("\n", $result));

Затем я перебираю $rows с помощью foreach сохранить что-то в базе данных.

Сценарий работает нормально, но при использовании файла CSV большего размера (> 10.000 строк) сценарий становится довольно медленным и выдает гораздо больше ошибок.

Я хотел бы разрезать файл CSV на части, чтобы не весь файл был импортирован в переменную. Я нашел следующее решение, но это все еще обрабатывает весь файл сразу.

Есть ли способ разрезать CSV на части и запустить функцию базы данных несколько раз? Или есть лучший способ обработать такой большой CSV-файл?

Я относительно новичок в обработке больших файлов, поэтому будьте добры!

2

Решение

Сохраните файл где-нибудь и затем обработайте его кусками следующим образом:

<?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);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]