Saltar al contenido

Importe el archivo CSV al controlador Laravel e inserte datos en dos tablas

Haz todo lo posible por entender el código bien antes de aplicarlo a tu trabajo si tquieres aportar algo puedes dejarlo en los comentarios.

Solución:

Hay 3 pasos para leer el archivo CSV e importarlo en la base de datos en Laravel.

  1. Leer archivo CSV
  2. convertirlo a array
  3. Finalmente crear registros en nuestra base de datos.

Antes de comenzar, he creado una muestra. test.csv archivo y ponerlo en mi carpeta pública en la carpeta de archivos:

name,email,password
user1,[email protected],pasxxxxxxxxxword
user2,[email protected],pasxxxxxxxxxword
user3,[email protected],pasxxxxxxxxxword

Paso 1 y 2; Creé una función auxiliar llamada csvToArraysolo lo puse en mi controlador por ahora (esta función está inspirada en este enlace) simplemente lee el archivo CSV y lo convierte a array:

function csvToArray($filename = '', $delimiter = ',')

Paso 3; Y aquí está mi paso final, lea array e insertarlo en nuestra base de datos:

public function importCsv()

    $file = public_path('file/test.csv');

    $customerArr = $this->csvToArray($file);

    for ($i = 0; $i < count($customerArr); $i ++)
    
        User::firstOrCreate($customerArr[$i]);
    

    return 'Jobi done or what ever';    

Nota: esta solución supone que tiene un modelo en su proyecto Laravel y tiene la tabla adecuada en su base de datos.

si utiliza dd($customerArr) obtendrás esto
ingrese la descripción de la imagen aquí

En tus store() método, cree el registro en su lists y luego iterar sobre el contenido del archivo CSV e insertar los datos en el customers mesa. Debe crear una relación entre clientes y listas para este propósito. También sería mejor usar algo como el paquete CSV de PHP League para leer dichos archivos:

public function store(AddCustomersRequest $request)

    // Get uploaded CSV file
    $file = $request->file('csv');

    // Create list name
    $name = time().'-'.$file->getClientOriginalName();

    // Create a list record in the database
    $list = List::create(['name' => $name]);

    // Create a CSV reader instance
    $reader = Reader::createFromFileObject($file->openFile());

    // Create a customer from each row in the CSV file
    foreach ($reader as $index => $row) 
        $list->customers()->create($row);
    

    // Redirect back to where you need with a success message

@maytham La solución de Maytham funcionará bien. Sin embargo, tendrá un gran problema si está tratando de hacerlo con grandes datos. Incluso si hace 1000 filas, creará un problema, ya que hará 1000 declaraciones de inserción por separado. Solo editaré el tercer método por él y agregaré mi propia entrada.

public function importCsv()

    $file = public_path('file/test.csv');

    $customerArr = $this->csvToArray($file);
    $data = [];
    for ($i = 0; $i < count($customerArr); $i ++)
    
        $data[] = [
            'column_name1' => 'value',
            'column_name2' => 'value2',
            .. so..on..and..on
        ];
        //User::firstOrCreate($customerArr[$i]);
    
    DB::table('table_name')->insert($data);
    return 'Jobi done or what ever';    

Esto llamará a la base de datos una vez para insertar tantas filas como desee. Ya sea 1000, 100000 o lo que sea.
Sin embargo, si tiene un csv enorme, esto también será un problema, ya que deberá insertarlo en fragmentos. Al igual que en PostgreSQL, me di cuenta de que puede insertar hasta 65000 filas en una declaración. Tal vez me equivoque con el número, pero hay un límite en cada base de datos y debe buscarlo.

Te mostramos reseñas y puntuaciones

Si piensas que ha sido útil este post, sería de mucha ayuda si lo compartes con más entusiastas de la programación y nos ayudes a difundir nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *