que le dará una solución a utilizar si tiene gran CVS y no desea utilizar gran parte de la RAM de su máquina (imagine que cada CSV es de 1 GB, por ejemplo).
<?php
function joinFiles(array $files, $result) {
if(!is_array($files)) {
throw new Exception('`$files` must be an array');
}
$wH = fopen($result, "w+");
foreach($files as $file) {
$fh = fopen($file, "r");
while(!feof($fh)) {
fwrite($wH, fgets($fh));
}
fclose($fh);
unset($fh);
fwrite($wH, "\n"); //usually last line doesn't have a newline
}
fclose($wH);
unset($wH);
}
Uso:
<?php
joinFiles(array('join1.csv', 'join2.csv'), 'join3.csv');
Dato curioso:
acabo de utilizar este a concat 2 archivos CSV de ~ 500.000 líneas cada uno. Tomó alrededor de 5 segundos y usó 512kb de memoria.
Lógica:
abrir cada archivo, leer una línea y luego escribir en el archivo de salida. Sí, puede ser más lento escribir cada línea en lugar de escribir un búfer completo, pero esto permite el uso de archivos pesados y, al mismo tiempo, es suave con la memoria de la máquina. En cualquier momento, está seguro porque el script solo lee en línea a la vez y luego lo escribe.
¡Disfrútalo!
O, si ya no necesita los datos originales, podría leer línea por línea la segunda csv y anexarla a la primera. Cuando haya terminado, elimine la segunda csv y cambie el nombre de la primera. – Catalin