根据另一个CSV中的值从一个CSV中提取值

时间:2012-06-20 20:47:21

标签: ruby fastercsv

我正在尝试找出根据lookup.csv中的值从名为master.csv的CSV文件中提取值的最佳方法,然后将新文件另存为output.csv

在下面的示例中,主文件包含三列数据,最后一列为City。我想将City名称替换为City Code文件中的lookup.csv

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

示例文件结构:

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

1 个答案:

答案 0 :(得分: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