使用Ruby按标题名称映射多个CSV文件

时间:2013-10-21 14:20:31

标签: ruby csv

我正在使用API​​,遗憾的是只允许我以csv格式下载信息。我想到的唯一选择是逐个下载~100个CSV文件,将csv文件的每一列存储到一个数组中,然后在完成后删除该CSV文件。每个文件都包含相同的列标题,但它们的顺序不同:

#CSV File 1

column1 | column3 | column2

#CSV File 2

column1 | column2 | column3

如何编写脚本以将每列添加到适当的数组(column1column2column3)?我目前正在人工创建这样的列,但这完全基于列号,而不是名称:

column1 = []
column2 = []
column3 = [] 

CSV.foreach(csv_file, :col_sep => "," :headers => false) do |column|  

  column1 << column[0]
  column2 << column[1]
  column3 << column[2]
end

2 个答案:

答案 0 :(得分:1)

使用CSV库,您可以使用标题中的名称访问每列。因此,如果您总是使用相同的标题,但顺序不同,则可以这样做:

CSV.foreach(csv_file, :col_sep => "," :headers => true) do |row|  
  do_whatever_you_want_with(row['your_header'])
end

答案 1 :(得分:1)

我认为最简单的方法是构建一个数组哈希,如:

require 'csv'

data    = Hash.new
array_of_csv_filenames.each do |file|
    csv = CSV.read(file, :headers => true)
    csv.by_col!

    csv.each do |name, values|
        data[name] = Array.new unless data[name]
        data[name].concat values
    end
end

然后,最后,数据将包含列的哈希值,按列名称键入。