如何删除CSV中的重复行?

时间:2016-11-13 05:49:12

标签: ruby csv

我有一个包含以下数据的CSV:

A.A.B. Direct   http://www.aabdirect.com    348 Willis Ave  Mineola NY  11501   (800) 382-1002  no email
Abeam Consulting Inc    http://abeam.com    245 Park Ave    New York    NY  10167   (212) 372-8783  no email
Abeam Consulting Inc    http://abeam.com    245 Park Ave    New York    NY  10167   (212) 372-8783  no email
Alvarez & Marsal    http://www.alvarezandmarsal.com 600 Madison Ave New York    NY  10022   (212) 759-4433  no email
Alvarez & Marsal    http://www.alvarezandmarsal.com 600 Lexington Ave Ste 6 New York    NY  10022   (212) 759-4433  no email

这里的关键是有时两行中的所有列都匹配(如Abeam Consulting Inc),但有时情况并非如此。有时只是网站匹配,或电话号码或名称匹配。

关键是网站。如果两个值具有相同的网站,我只想要一个。

如何以非N + 1方式删除此列表?

最好使用某些原生红宝石方法,例如.uniq或类似的东西。

1 个答案:

答案 0 :(得分:2)

只需将这些字符串(我已经简化以避免需要水平滚动)读入数组:

arr = [
  "A.A.B. Direct   http://www.aabdirect.com    (800) 382-1002",
  "Abeam Consulting Inc    http://abeam.com    (212) 372-8783",
  "Abeam Consulting Inc    http://abeam.com    (212) 372-8783",
  "Alvarez & Marsal    http://www.alvarezandmarsal.com (212) 759-4433",
  "Alvarez & Marsal    http://www.alvarezandmarsal.com 10022   (212) 759-4433"
]

并且,如您所知,使用Array#uniq,但使用块:

arr.uniq { |line| line[/\shttp:\S+/] }
  #=> ["A.A.B. Direct   http://www.aabdirect.com    (800) 382-1002",
  #    "Abeam Consulting Inc    http://abeam.com    (212) 372-8783",
  #    "Alvarez & Marsal    http://www.alvarezandmarsal.com (212) 759-4433"]

Array#uniq。正则表达式/\shttp:\S+/读取,"匹配空格后跟字符串"http:",后跟一个或多个字符而不是空格(贪婪)"。