【发布时间】:2011-08-23 11:28:51
【问题描述】:
我有一个包含数千个客户详细信息的 CSV 文件。我想根据所选标题的相同值来提取重复的客户。
例如,我想提取存在多个具有相同“姓氏”和“邮政编码”的记录的所有客户。
"surname","postcode","other-stuff-that-doesn't-matter"...
"smith", "AB1 2CD", "dxfh"...
"smith", "AB1 2CD", "98sf"...
"jones", "BC2 3DE", "as0j"...
"jones", "BC2 3DE", "9as6"...
"blogs", "BC2 3DE", "9as6"...
基于上述,程序将返回一个新的 CSV,如下所示:
"surname","postcode","other-stuff-that-doesn't-matter"...
"smith", "AB1 2CD", "dxfh"...
"smith", "AB1 2CD", "98sf"...
"jones", "BC2 3DE", "as0j"...
"jones", "BC2 3DE", "9as6"...
编辑
感谢到目前为止的帮助。我想我有一个可行的解决方案,但我很想知道这是否可以优化(我相信它可以!)。
set_one = Set.new
set_two = Set.new
duplicates = Array.new
headers = nil
CSV.foreach('customers.csv', :headers => true, :header_converters => :symbol) do |row|
headers = row.headers unless headers
values = [row[:surname], row[:post_code]]
if set_one.include? values
set_two << values
else
set_one << values
end
end
CSV.foreach('customers.csv', :headers => true, :header_converters => :symbol) do |row|
values = [row[:surname], row[:post_code]]
if set_two.include? values
duplicates << row
end
end
CSV.open("duplicate-customers.csv", "wb") do |csv|
csv << headers
duplicates.each { |dupe| csv << dupe }
end
【问题讨论】:
-
将其放入mysql或sqlite之类的数据库中,然后运行SQL查询。可能是最灵活的。
-
@hakre 谢谢,我可能会不定期地运行脚本,使用新的 CSV 文件和不同的输入值,因此每次都创建数据库似乎并不明智。
-
好吧,无论如何您可能都需要创建某种数据库。要么基于磁盘上的实际 CSV 文件(基于磁盘的数据库),要么基于内存中的数组(基于内存的数据库)。将 CSV 导入临时(可能在内存中)sqlite 数据库实际上对我来说并没有那么糟糕。
-
@hakre 你说得对,我可能是在找借口不使用任何 SQL!
标签: php ruby arrays algorithm csv