标题不在第1行CSV导入Ruby Rails

时间:2017-03-01 19:47:02

标签: ruby-on-rails ruby csv import

我试图导入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

2 个答案:

答案 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

如果要跟踪这些值,您必须弄清楚当找到标题时该怎么做。