【问题标题】:CSV Manipulation Unique EntriesCSV 操作唯一条目
【发布时间】:2020-08-13 13:00:24
【问题描述】:

我有几个 CSV 文件,格式如下(不带标题)

file1.csv:

firstname,lastname
andrew,harling
brad,dominic
pete,petey

file2.csv:

firstname,lastname,blood_group
andy,robbins,O+
brad,dominic,AB-
pete,petey,B+

目标:合并这两个文件并带有一些约束:

  1. 确保输出 csv 中存在所有唯一条目(请参阅下面的示例)
  2. 如果找到条目(根据 (firstname, lastname) 匹配),则仅从 file2.csv 中获取条目(带有血型)

示例输出.csv:

firstname,lastname,blood_group
andrew,harling
andy,robbins,O+
brad,dominic,AB-
pete,petey,B+

我尝试了以下方法:

  1. 将 file2.csv 复制到 file2_2col.csv(仅复制前 2 列)

  2. 现在使用 :

    从 file1(在 file2_2col 中找到)中删除重复的内容:

    comm -23 file1_without_duplicates.csv

  3. 合并 file1_without_duplicates.csv 和 file2.csv 使用:

    猫 *.csv |排序 - u > unique.csv

但这仍然包含重复的内容,例如:

错误的输出.csv:

firstname,lastname,blood_group
brad,dominic
pete,petey
andrew,harling
andy,robbins,O+
brad dominic AB-
pete,petey,B+

有什么建议吗?

【问题讨论】:

  • 作为参考,我的文件中没有这些标题;只是为了清楚起见才在这里添加

标签: python shell csv


【解决方案1】:

一个简短的 awk 程序

awk '
  BEGIN {FS = OFS = ","} 
  {name = $1 OFS $2}
  NR == FNR {f1[name] = 1; next}
  name in f1 {delete f1[name]}
  {print}
  END { for (name in f1) print name }
' file{1,2}.csv
firstname,lastname,blood_group
andy,robbins,O+
brad,dominic,AB-
pete,petey,B+
andrew,harling

【讨论】:

  • Ack,这些只是传达问题陈述的占位符;我的实际数据不包含任何空格或名称:)
  • 试过这个基于 awk 的脚本;仍在观察重复,例如:brad dominic brad dominic AB-
  • 您是否使用您在问题中输入的确切样本数据进行了测试?如果不是,那么您的两个输入文件之间肯定存在差异。如果文件有 DOS 样式的行结尾,那么一条记录将是 brad dominic\r,而“匹配”记录将是 brad dominic AB-\r——名称实际上是不同的。您可以尝试在输入文件上使用dos2unix
  • 得到了问题;它与 csv 文件的结构有关(更新了问题中的示例输入以反映实际的 csv 结构 -> 逗号)
  • 更新了我处理逗号的答案,
【解决方案2】:

更新的解决方案:

$ cat file{1,2}.csv
firstname,lastname
andrew,harling
brad,dominic
pete,petey
firstname,lastname,blood_group
andy,robbins,O+
brad,dominic,AB-
pete,petey,B+

$ gawk -F "," '{a[$1 "," $2] = $3} END{for(i in a){(a[i]=="") ? x=i : x=i "," a[i]; print x}}' file{1,2}.csv
andy,robbins,O+
firstname,lastname,blood_group
pete,petey,B+
andrew,harling
brad,dominic,AB-

【讨论】:

  • 更新了样本输入以反映实际的 csv 结构
猜你喜欢
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多