我试图导入CSV文件并且标题行不断移动,有时它在第20行,有时它在25行,依此类推,但是字段&#39 ; SPIRIT条形码'总是在标题中,这是我在这一点上唯一感兴趣的东西。我将其保存在"条形码"中。
我如何操纵它以找到行' SPIRIT条形码'是在并使用它作为标题? (标题上方的所有内容都可以忽略)
def self.import(file)
@b = []
CSV.foreach(file.path, headers: true) do |row|
entry = ZygReport.find_by(barcode: row['SPIRIT Barcode']) || new
entry.update({
:barcode => row['SPIRIT Barcode'],
})
entry.save!
@b << [entry.barcode]
end
end
忽略其他功能的@b
。
答案 0 :(得分:1)
此代码仅解析文件一次,逐行读取并查找SPIRIT Barcode
。
找到该行后,它会删除换行符,并将其拆分以获取一个标题名称数组。
可以直接在文件上调用 CSV.parse
。由于它已经被读取直到标题,它将从正确的行开始:
require 'csv'
sep = ';'
File.open('test.csv'){|file|
header = file.find{|line| line.include?('SPIRIT Barcode')}.chomp.split(sep)
CSV.parse(file, headers: header, col_sep: sep).each do |row|
p row
end
}
test.csv
为:
Ignore me
Ignore me
SPIRIT Barcode; B; C
1; 2; 3
4; 5; 6
输出:
#<CSV::Row "SPIRIT Barcode":"1" " B":" 2" " C":" 3">
#<CSV::Row "SPIRIT Barcode":"4" " B":" 5" " C":" 6">
让它适应您的数据应该不难。
答案 1 :(得分:0)
这是未经测试的,但这是您尝试做的一般想法:
require 'csv'
header_found = false
File.foreach('path/to/file.csv') do |li|
next unless header_found || li['SPIRIT Barcode']
header_found = true
# start processing CSV...
CSV.parse(li) do |row|
# use row here...
end
end
如果要跟踪这些值,您必须弄清楚当找到标题时该怎么做。