Leer archivos CSV grandes como una colección en Laravel - Amit Merchant - Un blog sobre PHP, JavaScript, etc.

Leer archivos CSV grandes como una colección en Laravel - Amit Merchant - Un blog sobre PHP, JavaScript, etc.

Los proyectos a gran escala a menudo requieren la importación de datos de archivos CSV de gran tamaño en algún momento. Y si no se maneja adecuadamente, puede conducir a problemas de memoria.

Afortunadamente, puedes usar el paquete CSV de League para leer fácilmente archivos CSV y explorarlos como una colección en Laravel. Especialmente, usando colecciones perezosas. De esta forma, puede leer archivos CSV como una colección sin cargar todo el archivo en la memoria.

Para empezar, primero puede instalar el league/csv paquete usando Composer como este.

composer require league/csv:^9.0

Una vez hecho esto, puede utilizar el League\Csv\Reader clase para leer el archivo CSV. Puede pasar la ruta al archivo CSV al constructor del Reader clase. Esto devolverá una instancia de Reader clase.

use League\Csv\Reader;

$cities = Reader::createFromPath('path/to/cities.csv');

Ahora puede establecer el desplazamiento del encabezado en 0 utilizando el setHeaderOffset() método. Esto establecerá la primera fila del archivo CSV como la fila de encabezado.

$cities->setHeaderOffset(0);

Entonces puedes usar el getRecords() método para iterar sobre el archivo CSV como una colección. Este método devuelve un constructor que se puede usar para explorar el archivo CSV como una colección.

Luego puede cambiar el generador a la LazyCollection::make() método para crear una colección perezosa. Esto devolverá una instancia de LazyCollection clase.

Y finalmente, puede usar uno de los métodos disponibles en el LazyCollection class para iterar sobre el archivo CSV como una colección.

Por ejemplo, puede utilizar el groupBy() método para agrupar registros por una columna específica, el map() método para mapear registros, filter() método para filtrar registros, etc.

Aquí está poniendo todo junto.

use Illuminate\Support\LazyCollection;
use League\Csv\Reader;

$cities = Reader::createFromPath('path/to/cities.csv');
$cities->setHeaderOffset(0);

$citiesCollection = LazyCollection::make(static fn () => yield from $cities->getRecords());
            ->groupBy('country')
            ->map(fn ($cities) => $cities->count())
            ->toArray();

Como puede ver, utilizamos un static cierre para crear un generador que se pasará al LazyCollection::make() método. es porque el LazyCollection::make() El método espera un generador como argumento.

Y es todo. De esta manera, puede leer archivos CSV como una colección en Laravel sin cargar todo el archivo en la memoria.

Aprendí esto a través de este tuit.

Si quieres conocer otros artículos parecidos a Leer archivos CSV grandes como una colección en Laravel - Amit Merchant - Un blog sobre PHP, JavaScript, etc. puedes visitar la categoría Código.

Deja un comentario

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

Subir

Esta página web utiliza cookies para analizar de forma anónima y estadística el uso que haces de la web, mejorar los contenidos y tu experiencia de navegación. Para más información accede a la Política de Cookies . Ver mas