Estoy escribiendo una aplicación Laravel para explotar cierta información que viene en archivos .csv, por lo que busqué en línea la mejor forma de hacerlo, y encontré este tutorial que recomienda usar el plugin maatwebsite/laravel-excel. Lo revisé y es un gran plugin, que te permite exportar a archivos de Excel (.xlsx) y también .csv, además de funcionar para cualquier base de datos con la que opere Laravel. Sin embargo yo requería una opción rápida para solo la carga, y me pareció un tanto excesivo, por lo que seguí el siguiente flujo de trabajo:

  • Crear los modelos con sus migraciones (php artisan make:model Modelo -m)

  • Modificar los archivos de migración para que representaran la estructura del archivo .csv, cabe decir que previamente me había asegurado que los archivos .csv de la aplicación estuvieran normalizados, para eso usé unos scripts de Python, pero esa es otra historia...
    Una nota importante sobre la migración: Parece algo trivial, pero hay que eliminar los timestamp que por default añade Laravel a las migraciones, es decir eliminar $table->timestamps(). Si no hacemos esto, vamos a causar un error dado que los datos del .csv no van a tener las columnas created_at y modified_at

  • Ejecutar las migraciones (php artisan migrate)

Una vez hecho lo anterior, ahora tenía que subir los archivos .csv a las tablas de destino, encontré que la forma más fácil es usar el siguiente comando en la consola (o en el IDE de base de datos que prefieras):

LOAD DATA FILE 'd:/datos/modelos.csv'
INTO TABLE modelos
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
IGNORE 1 ROWS;

En este ejemplo, tengo un archivo que se llama modelos.csv que está en mi directorio d:\datos. Es muy importante indicar la ruta completa del archivo, porque de otra forma asumirá que se encuentra en la ruta de datos del propio mySQL.

Otra cosa importante es el IGNORE 1 ROWS del final. Mis archivos .csv están bien formados e incluyen un primer renglón con el nombre de las columnas, por lo que es necesario saltarse ese renglón. Si tus archivos no tienen nombre de columnas, no es necesaria esta parte.

La instrucción LOAD DATA tiene muchísimas más opciones, por ejemplo, permite cierta transformación de los datos en el momento de la carga, que me imagino que serán útiles en el momento de trabajar con fechas, por ejemplo. Para ver todas las opciones, hay que revisar la documentación.