2011-03-24 19 views
8

Estoy tratando de combinar dos archivos CSV en PHP. Estoy buscando el método perfecto. Aquí está mi código hasta ahora:Combinando 2 archivos CSV

$one = fopen('data5.csv', 'r'); 
$two = fopen('userdata.csv', 'r'); 

$final = fopen('final_data.csv', 'a'); 

$temp1 = fread($one, filesize("data5.csv")); 
$temp2 = fread($two, filesize("userdata.csv")); 

fwrite($final, $temp1); 
fwrite($final, $temp2); 
+0

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

Respuesta

20

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!

+0

¿Cómo podemos unir múltiples archivos mientras ejecutamos un ciclo en la matriz joinFiles? algo como esto: ' para ($ f = 1; $ f <= 98; $ f ++) { joinFiles (array()); } ' –

2

¿Qué tal ...

file_put_contents('final_data.csv', 
    file_get_contents('data5.csv') . 
    file_get_contents('userdata.csv') 
); 

Tenga en cuenta que esta carga los archivos completos en la memoria de PHP sin embargo. Por lo tanto, si son grandes, es posible que tengas problemas de memoria_limitado.

0

Si desea simplemente concatenar los dos archivos que usted puede hacer esto fácilmente con la ejecución de un script de shell asumiendo que son en UNIX como sistema operativo:

exec("cat data5.csv > final_data.csv && cat userdata.csv >> final_data.csv");