1

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

4

3 回答 3

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 缓存并尝试

作曲家转储自动加载

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

于 2016-10-27T07:10:51.343 回答
1

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

于 2016-10-27T09:01:14.783 回答
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");
}
于 2020-02-25T19:13:15.230 回答