Ruby CSV文件中的重复头

Ruby CSV文件中的重复头,ruby,csv,Ruby,Csv,我尝试用ruby csv库解析csv文件,但该文件有两列,标题文本相同。可以访问列:column,即行[:column\u 1]和行[:column\u 2]或行[:column][0]和行[:column][1],或者我应该使用索引访问它吗 谢谢您可以使用索引: require 'csv' data = <<data a,b,c,b 1,2,3,4 9,8,7,6 data csv = CSV.new(data, :col_sep => ',', :headers =&g

我尝试用ruby csv库解析csv文件,但该文件有两列,标题文本相同。可以访问列
:column
,即
行[:column\u 1]
行[:column\u 2]
行[:column][0]
行[:column][1]
,或者我应该使用索引访问它吗

谢谢

您可以使用索引:

require 'csv'

data = <<data
a,b,c,b
1,2,3,4
9,8,7,6
data

csv = CSV.new(data, :col_sep => ',', :headers => true)
csv.each do |row|
  puts "b: %s, 1: %s, 3: %s" % [row['b'],row[1], row[3]]
end
如果有多个循环,还可以定义一个模块并扩展每一行:

require 'csv'

module RowExtension
  def b_1; self[1]; end
  def b_2; self[3]; end
end

data = <<data
a,b,c,b
1,2,3,4
9,8,7,6
data
csv = CSV.new(data, :col_sep => ',', :headers => true)
csv.each do |row|
  row.extend RowExtension
  puts row.b_1
  puts row.b_2
end
需要“csv”
模块行扩展
def b_1;自我[1];结束
def b_2;自我[3];结束
结束
数据=真)
csv.do每行|
row.extend行扩展
第1行b_1
第2行
结束
也许还可以扩展CSV类以返回特定的行元素。但这超出了我的实际知识范围


另一个解决方案是使用headers选项。headers选项定义了标题字段,因此您可以定义自己的标题:

require 'csv'

data = <<data
a,b,c,b
1,2,3,4
9,8,7,6
data
csv = CSV.new(data, :col_sep => ',', :headers => %w{a b_1 c b_2})
csv.each do |row|
  puts row['b_1']
  puts row['b_2']
end
需要“csv”
数据=%w{a b_1 c b_2})
csv.do每行|
放置行['b_1']
放置行['b_2']
结束

现在必须忽略第一行(旧标题行)。

如果有重复的标题,则第[:列]行将返回第一个值

您必须使用索引进行迭代

require 'csv'

filename = "/path/to/csv"

csv = CSV.table(filename, {:headers => :first_row})
headers = csv.headers

csv.each_with_index do |row, i|
    (0...headers.length).each do |j|
        column_header = headers[j]
        column_value = row[j]
        puts " Row #{i}: Header '#{column_header}' has value '#{column_value}'"
    end 
end

我对你的问题没有把握。但如果您想以表格格式访问CSV数据,只需使用CSV::table类,如下所示

csv = CSV.table(filename)
csv = CSV.parse('csv_string')
csv_array = csv.transpose 
是关于方法的更多信息吗

如果您想在解析数据后以列为单位访问数据,只需按如下方式转换数组

csv = CSV.table(filename)
csv = CSV.parse('csv_string')
csv_array = csv.transpose 

今天,我在寻找解决类似问题的最佳方法时找到了这个答案,我惊讶地发现没有投票。使用模块来扩展行是非常聪明的!非常感谢。