2011-03-24 137 views
8

我想在PHP中結合兩個CSV文件。我正在尋找完美的方法。這裏是我到目前爲止的代碼:結合2個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

或者,如果您不再需要原始數據,則可以逐行讀取第二個csv並將其追加到第一個。完成後,刪除第二個csv並重命名第一個。 – Catalin 2011-03-24 10:42:37

回答

20

我會給你一個解決方案,如果你有大的使用CVS並且你不想使用你機器的很多RAM(例如,假設每個CSV都是1GB)。

<?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); 
} 

用法:

<?php 
joinFiles(array('join1.csv', 'join2.csv'), 'join3.csv'); 

有趣的事實:

我只是用這個Concat的2個CSV文件〜每50萬線。它花了約5秒鐘,並使用512kb的內存。

邏輯:

打開每個文件,讀取一條線,然後將其寫入到輸出文件中。是的,寫每一行可能會比較慢,而不是寫一個完整的緩衝區,但是這樣可以在機器內存溫和的情況下使用繁重的文件。 在任何時候,您都是安全的,因爲腳本一次只能在線閱讀並寫入。

享受!

+0

我們如何在joinFiles數組上運行循環時加入多個文件。 類似這樣的: ' for($ f = 1; $ f <= 98; $ f ++){ joinFiles(array()); } ' – 2015-11-06 03:47:50

2

......怎麼

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

注意,這雖然加載整個文件到PHP內存。所以,如果它們很大,你可能會遇到memory_limit問題。

0

如果你想只與執行shell腳本假設你在類Unix操作系統很容易將兩者連接起來的文件,你可以這樣做:

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