【问题标题】:Header not in Row 1 CSV Import Ruby Rails标题不在第 1 行 CSV 导入 Ruby Rails
【发布时间】:2017-07-21 07:22:59
【问题描述】:

我正在尝试导入 CSV 文件,但标题行一直在移动,有时在第 20 行,有时在第 25 行,依此类推,但“SPIRIT Barcode”字段始终在标题中,它是唯一的我在这一点上感兴趣的事情。我将其保存在“条形码”中。

如何操作它以找到“SPIRIT Barcode”所在的行并将其用作标题? (标题上方的所有内容都可以忽略)

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,这是另一个功能。

【问题讨论】:

  • 您可能需要在解析文件之前重写文件。您的标题行是否有任何显着特征可以帮助您找到它?
  • 它有区分“TALLY”和“SPIRIT Barcode”等其他一些文件中没有的词
  • 文件是否足够小,可以在内存中完全读取?
  • 通常
  • 找到该行,将其分流到顶部,将修改后的版本提供给CSV.parse

标签: ruby-on-rails ruby csv import


【解决方案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">

根据您的数据调整它应该不难。

【讨论】:

    【解决方案2】:

    这是未经测试的,但这是您尝试做的总体思路:

    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
    

    如果要跟踪值,则必须弄清楚找到标头时要做什么。

    【讨论】:

    • 你不使用标题,是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2016-04-24
    • 2016-01-23
    • 2012-02-14
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多