我正在使用以下包将大型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]
我尝试使用以下链接获取解决方案,但没有运气:
答案 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");
}