在Laravel中导入大型csv

时间:2016-10-27 07:05:48

标签: laravel csv maatwebsite-excel

我正在使用以下包将大型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

3 个答案:

答案 0 :(得分:1)

您是否在插入数据库之前对每行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缓存并尝试

composer dump-autoload

还有一件事是确保csv中没有无法导入的特殊字符。

答案 1 :(得分:1)

使用Laravel的DB对象,尝试使用LOAD DATA INFILE MySQL过程而不是该包。这是一个example。 我使用它来将大尺寸的csv文件(300M-400M)导入到mysql数据库中并为我工作。

答案 2 :(得分:0)

加载数据本地文件!我真的很想念MySQL,我用它来摄取一个巨大的CVS文件,在我们的服务器中大约6gb,大约用了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");
}