0

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

#CSV File 1

column1 | column3 | column2

#CSV File 2

column1 | column2 | column3

如何编写脚本以将每一列添加到适当的数组(column1, column2, column3)?我目前正在人为地创建这样的列,但这严格基于列号,而不是名称:

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

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

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

2 回答 2

1

使用 CSV 库,您可以使用标题中的名称访问每列。因此,如果您始终拥有相同的标题,尽管顺序不同,您可以这样做:

CSV.foreach(csv_file, :col_sep => "," :headers => true) do |row|  
  do_whatever_you_want_with(row['your_header'])
end
于 2013-10-21T15:24:20.493 回答
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

然后,最后,数据将包含列的散列,以列名作为键。

于 2013-10-21T15:41:34.453 回答