2012-06-20 36 views
0

我试图根据master.csv中的值从一个名为lookup.csv的CSV文件中提取值的最佳方法,然后将新文件保存为output.csv基于另一个值中的值从一个CSV中提取值

在下面的例子中,主文件有三列数据,最后一列是City。我想用lookup.csv文件替换City名称与City Code

我没有可以查找的数据库,所以我不得不使用CSV文件。我正在尝试在Ruby 1.8.7上使用FasterCSV。

示例文件结构:

master.csv:

First Name | Last Name | City 
Joey  | Jello  | Atlanta 
Home  | Boy  | Dallas 

lookup.csv:

City | City ID 
Atlanta | 12345 
Dallas | 12346 
Houston | 12347 

output.csv:

First Name | Last Name | City 
Joey  | Jello  | 12345 
Home  | Boy  | 12346 
+0

“我没有DB”为什么不考虑SQLite的?它几乎适用于所有的操作系​​统,非常适合临时和内存数据库。这会简化和加快你的任务。加载CSV到它,然后你可以做随机访问,而不是顺序文件读取。 –

回答

1

我使用的是1.9 ,其中FasterCSV可用标准库中的CSV。首先我想创建一个查找散出来的lookup.csv

cities = Hash[CSV.read('lookup.csv', :col_sep => ' | ').to_a[1..-1]] 

如果该文件是非常大的,你可能要遍历它CSV.foreach和行建行哈希:

cities = {} 
CSV.foreach('lookup.csv', :col_sep => ' | ', :headers => true, :return_headers => false) do |line| 
    cities[line['City']] = line['City ID'] 
end 

然后在master.csv迭代,做城市的查找哈希和写入到output.csv

CSV.open('output.csv', "w", :headers => ['First Name', 'Last Name', 'City ID'], :write_headers => true) do |output| 
    CSV.foreach('master.csv', :col_sep => ' | ', :headers => true, :return_headers => false) do |line| 
    output << [line['First Name'], line['Last Name'], cities[line['City']]] 
    end 
end 
+0

迈克尔 - 非常感谢你的例子。这完全符合我的需要。 – mpowmap

+0

很高兴帮助!如果你想接受答案投入满意,我终于有20K的声望;-) –

相关问题