2016-11-13 127 views
0

我有了这样的数据的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方式重新制作此列表?

最好用一些本地ruby方法,如.uniq或类似的东西。

+0

使用CSV#foreach。 –

回答

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:",随后通过除空白字符(贪婪地)其他一个或多个字符”。

+0

虽然这是问题。注意你的'uniq'd数组,在它应该有的时候没有移除第二个'Alvarez&Marsal'条目? :|这似乎只能删除相同的行 - 我需要删除以前看到网站的任何行。 – marcamillion

+0

对不起,我没有仔细阅读这个问题。我相信我的答案现在可以,但请告诉我,如果不是。 –

+0

无论如何要在'CSV'类中做到这一点?例如像Alireza建议的那样使用CSV#foreach。 – marcamillion