【问题标题】:How Can I Remove Duplicate Rows from CSV file with PHP如何使用 PHP 从 CSV 文件中删除重复的行
【发布时间】:2013-07-01 13:46:20
【问题描述】:

我的 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 中?)

【问题讨论】:

  • fgetcsv 只得到一行。如果需要所有行,则需要循环。

标签: php csv


【解决方案1】:

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

$lines = file('csv.csv');
$lines = array_unique($lines);
file_put_contents(implode(PHP_EOL, $lines));

【讨论】:

  • 嗯,我想我需要更多的逻辑......我怎样才能记下重复的行?
  • 顺便说一句,当我运行这个时,重复项不会被删除
  • @sectus -- 只是建议您可能想要使用array_keys(array_flip())array_flip(array_flip()) 而不是array_unique(),因为性能差异很大。 @Alex -- 如果您使用 array_unique()array_flip(array_flip())array_diff_key($before, $after) 将为您提供丢弃的项目密钥。
  • @Alex,抱歉,已更改答案(已添加 $lines =
【解决方案2】:

我会走这条路线,这会比 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()) 只会匹配完全相同相同的重复行。

已更新以包含来自我的 cmets 的信息。

【讨论】:

    【解决方案3】:

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

    $dataset = array();
    foreach($line as $data){
        $dataset[sha1($data)] = $data;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-03-29
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多