我正在关注的教程:
https://dcblog.dev/laravel-import-large-csv-file
我实际上正在按照本教程使用 chunk()
将一个巨大的 CSV 文件导入数据库。根据本教程,在将巨大的 CSV 记录分割成每个文件 1000 条记录后,应该将该文件存储在我们的 resources
文件夹内的临时文件夹中,然后使用 updateOrCreate()
方法将这些文件批量上传到数据库中。但我只能将巨大的 CSV 记录分割成每个文件上的 1000 条记录并存储在临时文件夹中,但无法插入数据库。如果你们中的任何一个好心人通过这个链接并找出我在这里做错了什么,这对像我这样的初学者会有很大的帮助?
此代码应将数据存储在数据库中。
<?php
namespace App\Console\Commands;
use App\Models\Subscription;
use Illuminate\Console\Command;
class importSubscription extends Command
{
protected $data;
/**
* The console command name.
*
* @var string
*/
protected $name = 'import:subscriptions';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Import Subscriptions from an array.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$path = base_path("resources/pendingsubs/*.csv");
foreach (array_slice(glob($path),0,2) as $file) {
$data = array_map('str_getcsv', file($file));
foreach($data as $row) {
Subscription::updateOrCreate([
'email' => $row[0],
], ['email' => $row[0]]);
}
unlink($file);
}
}
}
您可以使用如下所示的内容。不要忘记定义
$filePath
和 $chunkSize
。
如果数据太大,您可能需要使用
ini_set('memory_limit', '-1');
暂时禁用内存限制
public function importCsv()
{
$rowCount = 0;
$chunkData = [];
if (($fileHandle = fopen($filePath, "r")) === false) {
return;
}
while (($row = fgetcsv($fileHandle)) !== false) {
$chunkData[] = [
"title" => $row[1],
"name" => $row[2]
// ...
];
$rowCount++;
if ($rowCount === $chunkSize) {
Model::insert($chunkData);
$chunkData = [];
$rowCount = 0;
}
}
if (!empty($chunkData)) {
Model::insert($chunkData);
}
fclose($fileHandle);
}