Импортировать большой csv в Laravel

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

https://github.com/Maatwebsite/Laravel-Excel

Вот мой код контроллера:

Excel::filter('chunk')->load($file)->chunk(250, function($results) use ($count)
    {
        ++$count;

        echo "<br/> Count = " . $count;

        foreach($results as $row)
        {
            // do stuff
        }

Вот строка из composer.json

"maatwebsite/excel": "~2.1.0"

Вот мой файл config / app.php:

'providers' => [
 ....
 ....
 Maatwebsite\Excel\ExcelServiceProvider::class,
 ],

 'aliases' => [
 ....
 ....
 'Excel' => Maatwebsite\Excel\Facades\Excel::class,
 ]

Я получаю эту ошибку и не могу найти решения:

InvalidArgumentException in Dispatcher.php line 333:
No handler registered for command [Maatwebsite\Excel\Readers\ChunkedReadJob]

Я попробовал следующую ссылку для решения, но не повезло:

https://github.com/Maatwebsite/Laravel-Excel/issues/957

https://github.com/Maatwebsite/Laravel-Excel/issues/952


person Ashutosh    schedule 27.10.2016    source источник


Ответы (3)


Вы делаете какие-то манипуляции для каждой строки csv перед вставкой в ​​базу данных или вам нужно импортировать данные непосредственно в базу данных?

Просто быстрый совет, ваш csv находится в той последовательности, в которой упорядочены столбцы таблицы базы данных, вы можете использовать терминал ubuntu для импорта файлов большего размера:

mysql -uroot -proot --local_infile=1 3parsfdb -e "LOAD DATA LOCAL INFILE '/logfiles/Bat_res.csv' INTO TABLE Bat_res FIELDS TERMINATED BY ','"

Если это то, что вы хотите сделать программно или в cron, то вам понадобится этот пакет. Можете ли вы попробовать очистить кеш laravel, а также попробовать

композитор дамп-автозагрузка

Еще одна вещь - убедиться, что в csv нет специальных символов, которые нельзя импортировать.

person Mihir Bhende    schedule 27.10.2016
comment
Хорошо, позвольте мне быстро проверить файлы github. - person Mihir Bhende; 27.10.2016
comment
Можете ли вы попробовать следующее: Изменить класс ChunkedReadJob реализует ShouldQueue на класс ChunkedReadJob extends Job реализует ShouldQueue или класс ChunkedReadJob расширяет Job реализует ShouldQueue, SelfHandling - person Mihir Bhende; 27.10.2016
comment
Также проверьте это: stackoverflow.com/questions/ 31208519 / - person Mihir Bhende; 27.10.2016

Вместо этого пакета попробуйте процедуру MySQL LOAD DATA INFILE, используя объект DB Laravel. Вот пример . Я использовал это для импорта файлов csv большого размера (300–400 МБ) в базу данных mysql и работал у меня.

person Zoli    schedule 27.10.2016

ЗАГРУЗИТЬ ДАННЫЕ В ЛОКАЛЬНЫЙ ИНФАЙЛ! Мне очень не хватало MySQL, я использовал его для загрузки огромного файла CVS, около 6 ГБ на нашем сервере, это заняло около 20 минут.

Вы можете использовать что-то вроде этого:

private function importData(int $ignoreLines, string $fileName) : void
{
    //$this->setLOG("Importing data, please wait", "i");
    $table = 'npdata_csvfile_temp';

    $importDB  = "LOAD DATA LOCAL INFILE '$fileName' ";
    $importDB .= "INTO TABLE $table ";
    $importDB .= "COLUMNS TERMINATED BY ',' ";
    $importDB .= 'OPTIONALLY ENCLOSED BY "\""';
    $importDB .= "LINES TERMINATED BY '\\n' ";
    $importDB .= "IGNORE $ignoreLines LINES ";

    DB::connection()->getpdo()->exec($importDB);
    //$this->setLOG("Done with importing data", "i");
}
person Efren Robles    schedule 25.02.2020