Импорт csv в mysql - готовый модуль

Статус
В этой теме нельзя размещать новые ответы.
На стеке завалялся Для просмотра ссылки Войди или Зарегистрируйся, может будет полезен.
Только нужны доработки:
PHP:
 while (($fileop = fgetcsv($handle, 1000, ",")) !== false)
вместо 1000 поставить 0 - иначе на строках длиннее 1000 символов будет логическая ошибка они как 2 или более значений массива будут представлены

PHP:
$sql = "INSERT INTO details(name, age, location) VALUES ('$name', '$age', '$location')";
$query = Yii::$app->db->createCommand($sql)->execute();
Заменить на batchInsert вызываемый раз в 100 или 1000 строк и после цикла - будет заметно быстрее.

+ там можно нарваться на ошибку: перезапись файла еще до того как предыдущий распарсен из-за time() и отсутствия проверки существования файла и lock`ов.
 
Может проще включить вывод ошибок и посмотреть чего не хватает серверу на больших файлах и подкрутить этот параметр в php.ini?
Не проще.
Из практики оптимизации: файл лога на 100МБ в gz архиве при неумелом парсинге до 4ГБ оперативки может требовать, memory_limit на такой объём на 32 bit OS поставить не получится. Да и сервера с таким объёмом не так уж и часто попадаются + стоят дорого.
При этом нормальный построчный парсер не выходит за пределы 8-10МБ памяти (с фреймворком и относительно большими данными).
 
В общем у тебя довольно простая задача, чего ты забоялся больших файлов, тебе же их не целиком в базу лить, потихоньку делай. Как говорят при игре в дурака: "Ходи по 1 - не ошибешься".


Можно Вас попросить написать любой пример кода, который сможет импортировать excel файл размером 7mb в mysql...
На данном этапе использовать мемкеш рановато, так как мой комп зависает когда пытается вытащить из excel информацию, а не при обработке ее в базе...

При выполнении этой части кода происходит зависание:
PHP:
$objectPhpExcel = $objectreader->load($fileName);

P.S. касается только объемных файлов, файлы до 1mb импортируются без проблем...
Относительно советов грузить построчно, то просьба показать пример!


Вот тебе пример кода, который может спокойно 300мб csv переварить и довольно быстро.
Код:
// Определяем колонки из первой строки файла   

$amount = 50; //сколько строчек заливать за 1 заход
$f = fopen('$filepath', 'r');
// Переходим на заданную позицию, если импортируем не сначала
if ($from = $this->request->get('from')) {
        fseek($f, $from);
}
$pi = pathinfo($filepath);
$filename= $pi['filename'];
$columns = fgetcsv($f, null, ';'); //ставишь чем там у тебя разделено, если эксель, то ; хоть и называется csv

//Теперь сделаем таблицу для наших столбцов

$str = array();
$str2 = array();
foreach($columns as $col){
        $str[] = " `$col` varchar(1000) DEFAULT '' ";
        $str2[] = "`$col`";
}
$str = implode(', ', $str);
$str2 = implode(', ', $str2);

if(!isset($from)){
      $mysqli->query("CREATE TABLE `$filename` ($str)");
}

//таблица есть, теперь запилим в нее оставшиеся строчки файла
while($row = fgetcsv($f, null, ';') && $count < $amount){
foreach($row as &$r){
$r = "'$r'";
}
unset($r);
$vals = implode(', ', $row);
$mysqli->query("INSERT INTO `$filename` VALUES ($vals)");
$count++;
}
// Запоминаем на каком месте закончили импорт
$from = ftell($f);
print "from: $from";
//это тестовый пример, тут на каждом цикле место остановки будет просто выводится на экран
 
Последнее редактирование:
Спасибо конечно, но неплохо бы посмотреть на дату последнего сообщения )
Мы сейчас уже работает над дектопной версией - получения, обработки, и импорта в эту систему готового прайс-листа )
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху