Como dividir un csv en varios ficheros en php

5/5 - (1 voto)

Cuando trabajamos con grandes ficheros .csv es bastante comun que la memoria se desborde y no podemos terminar el proceso que estabamos realizando.

Con esta pequeña entrada voy a explicar a separar csv en ficheros pequeños con un script en php muy sencillito.

Lo primero que haremos es definir las variables iniciales, fichero de salida, registros por ficheros y contadores.

##nombre salida ficheros
$outputFile = 'salida-';

## 10k registros en cada fichero
$splitSize = 10000; 

# definimos variables
$rows = 0;
$fileCount = 0;
$out = null;

Lo siguiente que haremos es abrir el csv en modo lectura.

## abrimos flujo de lectura del .csv
$in = fopen('origen.csv', 'r');

Y en la parte logica del script, crearemos un bucle que creara un fichero de salida con los registros definidos en la variable $splitsize

## bucle para separar en ficheros
while (!feof($in)) {
	
	## obtenemos el resudio == 0 para el limit de registros por fichero
    if (($rows % $splitSize) == 0) {
        if ($rows > 0) {
            fclose($out);
        }

		## contador del fichero
        $fileCount++;

        ## parseamos la salida de los ficheros  salida-0001.csv, salida-0002.csv etc
        $fileCounterDisplay = sprintf("%04d", $fileCount);

		## varaible del fichero de salida
        $fileName = "$outputFile$fileCounterDisplay.csv";
		
		## guardamos en el fichero de salida
        $out = fopen($fileName, 'w');
    }

	## leemos el csv
    $data = fgetcsv($in);

	## registros el csv
    if ($data)
        fputcsv($out, $data);

	## contador de ficheros
    $rows++;
}

Ejecutando el script podemos ver como se han creado lso ficheros csv separados.

Salida ficheros csv

A continuación incluyo el script con todo el codigo:

<?php

##nombre salida ficheros
$outputFile = 'salida-';

## 10k registros en cada fichero
$splitSize = 10000; 

## abrimos flujo de lectura del .csv
$in = fopen('origen.csv', 'r');

# definimos variables
$rows = 0;
$fileCount = 0;
$out = null;

## bucle para separar en ficheros
while (!feof($in)) {
	
	## obtenemos el resudio == 0 para el limit de registros por fichero
    if (($rows % $splitSize) == 0) {
        if ($rows > 0) {
            fclose($out);
        }

		## contador del fichero
        $fileCount++;

        ## parseamos la salida de los ficheros  salida-0001.csv, salida-0002.csv etc
        $fileCounterDisplay = sprintf("%04d", $fileCount);

		## varaible del fichero de salida
        $fileName = "$outputFile$fileCounterDisplay.csv";
		
		## guardamos en el fichero de salida
        $out = fopen($fileName, 'w');
    }

	## leemos el csv
    $data = fgetcsv($in);

	## registros el csv
    if ($data)
        fputcsv($out, $data);

	## contador de ficheros
    $rows++;
}

fclose($out);
?>

2 comentarios en «Como dividir un csv en varios ficheros en php»

Deja un comentario