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

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

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

我没有可以查找的数据库,所以我不得不使用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.9,其中FasterCSV在标准库中可用作CSV 。 首先,我从lookup.csv创建一个查找哈希:

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

如果文件非常大,您可能希望使用CSV.foreach迭代它并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