Я разрабатываю приложение, которое должно читать большие файлы CSV и данные процесса. Это будет невозможно сделать в одном запросе, потому что обработка данных также требует времени, это не просто чтение.PHP: Как читать файл csv по частям с использованием запроса AJAX
Так что я пытался до сих пор, и что работает хорошо до сих пор является следующее:
// Open file
$handle = fopen($file, 'r');
// Move pointer to a place where it stopped last time
fseek($handle, $offset);
// Read limited line and process
for ($i = 0; $i < $limit; $i++) {
// Get length of line for offset purposes
$newlength = strlen(fgets($handle));
// Move pointer back. fgets moves pointer so we move it back for fgetcsv to get that line again
fseek($handle, $offset);
$line = fgetcsv($handle, 0, $csv_delimiter);
// Process data here
// Save offset
$offset += $newlength;
}
Так что проблема здесь, на этой линии:
$newlength = strlen(fgets($handle));
Это терпит неудачу, когда столбец CSV имеет разрывы строк.
Я также пробовал $newlength = strlen(implode(';', fgetcsv($handle, 0, $csv_delimiter)));
, но это не всегда работает. Обычно это заканчивается неудачей для нескольких персонажей. Вероятно, цитаты и конец строки здесь неправильно обрабатываются.
Все, что мне нужно, это получить длину строки csv, а не только одну строку, но csv-строку, которая может иметь разрывы строк в кавычках.
У кого-нибудь есть лучшее решение?
Я отправил задание в очередь на работу и планировал, как cron периодически обрабатывать эти задания из командной строки. И отправьте уведомление соответствующему лицу, когда работа выполнена. – jeroen
Это не связано с моим вопросом. Крон станет следующей. Сначала мне нужно исправить скрипт для обработки данных. – Jamol