CartmanGui
@CartmanGui

Как работать с большим csv файлом?

Есть csv файл с большим количеством строк нужно реализовать возможность его обработки по частят т/к у шараварных хостеров время на выполнение php скрипта ограничено и из-за этого весь csv не успевает обработаться. Есть решение узнать количество строк разбить файл на n частей после чего через ajax дергать скрипт который бы считывал нужное количество строк но тут возникает проблема что каждый раз нужно открывать файл и в цикле пробегая по строкам пропускать уже ранее обработанные
$handle = fopen($file, "r");
$rows = 0;
while($csv = fgetcsv($handle)) {
		if($rows>= $stop) {
			break;
		}
		if($rows < $start) {
			$rows++;
			continue;
		}
		...
	}
	fclose($handle);


Конечно можно сразу разбить сам файл на n файлов и работать уже на каждой итерации с ним на может есть какое то более изящное решение?
  • Вопрос задан
  • 2774 просмотра
Пригласить эксперта
Ответы на вопрос 7
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
filesize, fopen, fseek, fgets - должны помочь пропускать уже обработанные строки.
1. Считываете по-символьно строку за строкой, всегда определяете максимальное время обработки одной строки.
2. Как только превышен максимальный лимит времени минус 3*макс. время одной строки (3-й запас), то запоминаем позицию и останавливаем чтение из файла.
3. Позицию для продолжения - передаём (возвращаем) в ajax (в браузер)
4. Используя эти параметры, при запуске скрипта вызываем seek на стартовую позицию и продолжаем обработку файла.
Ответ написан
sim3x
@sim3x
Подключиться к субд снаружи и загрузить файл через штатные средства
Ответ написан
alsopub
@alsopub
Попробуйте разбить его не на n строк, а на N килобайт.
Нужно будет только немного заморочиться с обработкой строк, на которые будут попадать границы блоков. Например в начале блока убирать символы до \n, а после блока прочитать еще nN байт, пока не встретится \n.
Ответ написан
Комментировать
SagePtr
@SagePtr
Еда - это святое
Можно после каждой обработанной строки (или каждую N-ную строку) сохранять где-нибудь смещение относительно начала файла, а потом при следующем запуске начинать с этого смещения.
Ответ написан
dmitriylanets
@dmitriylanets
веб-разработчик
так при превышении лимита можно заставить работать скрипт и дальше, вам главное контролировать процесс выполнения. это можно например через аякс, посылая запросы и получая ответ например с кол-вом обработанных строк. информацию о обработанных строках будет вести сам скрипт чтения данных сохраняя в бд/файле лога.
Ответ написан
CartmanGui
@CartmanGui Автор вопроса
вот надыбал решение parsing-and-i.blogspot.com/2010/05/php-csv.html по принципам того что предложил xmoonlight
Ответ написан
Комментировать
@ivanovnickolay
stackoverflow.com/questions/14127529/mysql-import-...
Команда LOAD DATA INFILE читает строки из текстового файла и вставляет их в таблицу с очень высокой скоростью.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы