【问题标题】:Import big csv in Laravel在 Laravel 中导入大 csv
【发布时间】:2016-10-27 07:05:48
【问题描述】:

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

【问题讨论】:

    标签: laravel csv maatwebsite-excel


    【解决方案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 中没有无法导入的特殊字符。

    【讨论】:

    • 好的,让我快速检查一下github文件。
    • 您可以尝试以下任何一种方法:将“ChunkedReadJob 类实现 ShouldQueue”更改为“ChunkedReadJob 类扩展 Job 实现 ShouldQueue”或“ChunkedReadJob 类扩展 Job 实现 ShouldQueue、SelfHandling”
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      加载数据本地文件!我真的很想念 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-12-20
        • 2016-11-28
        • 2021-11-15
        • 2018-07-06
        • 2017-01-27
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        相关资源
        最近更新 更多