2012-12-30 155 views
2

我需要獲取兩個CSV文件之間的差異,在這種情況下,file2.csv中的最新文件用相同的數據覆蓋具有相同值的行,並刪除具有相同數據的行。PHP排序不按預期工作?

file1.csv

GHI, 0, 0 
ABC, 12, 1 
DEF, 10, 1 

file2.csv

ABC, 8, 1 
DEF, 10, 1 
GHI, 2, 0 

最終的CSV應該是這樣的:

ABC, 8, 1 
GHI, 2, 0 

PHP代碼:

<?php 
    $file1 = file('file1.csv'); 
    $file2 = file('file2.csv'); 

    sort($file1); 
    sort($file2); 

    var_dump($file1); 
    var_dump($file2); 

    $diff = array_diff($file2, $file1); 

    var_dump($diff); 

    ?> 

返回此

ABC, 8, 1 
DEF, 10, 1 
GHI, 2, 0 

現在,當我手動更改file1.csv這樣:

ABC, 12, 1 
DEF, 10, 1 
GHI, 0, 0 

它返回預期:

ABC, 8, 1 
GHI, 2, 0 

當我傾倒數組排序似乎排序功能就如同我手動更改訂單時一樣工作

ABC, 12, 1 
DEF, 10, 1 
GHI, 0, 0 

但它似乎不產生相同的最終結果。任何線索?

回答

1

file將文件拆分成行,但每行仍有其結尾換行符。最後一行不是。因此,它不等於文件中間的同一行內容。

爲了解決這個問題,你可以換行添加到最後一個元素:

$file1[count($file1)-1] .= PHP_EOL; 
$file2[count($file2)-1] .= PHP_EOL; 

或者你也可以從所有行剝奪他們:

array_walk($file1,function(&$a) {$a = trim($a);}); 
array_walk($file2,function(&$a) {$a = trim($a);}); 
+2

或者你可以使用'FILE_IGNORE_NEW_LINES'國旗... – deceze

+0

那也是。我不知道那個標誌XD –

+0

謝謝我只是打着價值觀,注意到缺失的換行符,當然轉儲沒有顯示。謝謝 – Stofke