Ruby CSV文件中的重复头
我尝试用ruby csv库解析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
: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
今天,我在寻找解决类似问题的最佳方法时找到了这个答案,我惊讶地发现没有投票。使用模块来扩展行是非常聪明的!非常感谢。