1

我有如下所示的 CSV 文件:

account, name, email,
123, John, dsfs@email.com
123, John, dsfs@email.com
1234, Alex, ala@email.com

我需要删除重复的行。我尝试这样做:

$inputHandle = fopen($inputfile, "r");
$csv = fgetcsv($inputHandle, 1000, ",");

$accounts_unique = array();

$accounts_unique = array_unique($csv);  

print("<pre>".print_r($accounts_unique, true)."</pre>");

但是我只进入 print_r 的第一个标题行。为了确保我需要做些什么 1. 我从重复的行中清除 CSV 文件 2. 我可以列出这些重复项(也许将它们存储在另一个 CSV 中?)

4

3 回答 3

4

简单的解决方案,但如果文件真的很大,它需要大量的内存。

$lines = file('csv.csv');
$lines = array_unique($lines);
file_put_contents(implode(PHP_EOL, $lines));
于 2013-07-01T13:51:19.473 回答
1

无论如何,如果您要从 CSV 循环数据,我认为最好做这样的事情。

$dataset = array();
foreach($line as $data){
    $dataset[sha1($data)] = $data;
}
于 2014-06-08T00:27:02.160 回答
1

我会走这条路线,这将比 array_unique 更快:

$inputHandle = fopen($inputfile, "r");
$csv = trim(fgetcsv($inputHandle, 1000, ","));
$data = array_flip(array_flip($csv)); //removes duplicates that are the same
$dropped = array_diff_key($csv, $data); //Get removed items.

注意 -array_unique()并且array_flip(array_flip())只会匹配完全相同的重复行。

更新以包含我的评论中的信息。

于 2013-07-01T13:59:01.210 回答