将巨大的csv文件导入laravel中的数据库

问题描述 投票:0回答:2

我正在关注的教程:

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);
        }
    }
}


php laravel chunks
2个回答
0
投票

您可以使用如下所示的内容。不要忘记定义

$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);
}

-2
投票

为什么你使用 Laravel 来做这个,有必要吗?

因为只需一个命令即可轻松完成。

按照此链接

© www.soinside.com 2019 - 2024. All rights reserved.