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.
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);
?>
Genial amigo
Muchisimas gracias!! Me has sacado de un buen apuro, muy buen post.