【问题标题】:read csv file from given index to index in rails从给定索引读取csv文件到rails中的索引
【发布时间】:2019-02-01 20:24:57
【问题描述】:

我有数百万行的非常大的文件,我想将它们插入数据库,但我无法同时创建或导入,因为它会阻塞 db 并占用大量内存。所以,我想让从 csv 文件读取索引到索引的工作(例如,第一个工作读取 0 到 1000 行,其他工作读取 1000 到 2000 行)但我认为 CSV.foreach 没有这种功能,我无法在作业的参数中发送 1000 行数据,并且无法在每个作业中打开此文件。所以,请指导我

在获得文件路径后,我读取了总行数(假设为 100 万行)并分为 1000 个作业,在每个作业中我给出文件路径和索引,作业必须从其中开始读取。 在每个工作中

def perform(file_name, index){

    CSV.foreach(file_name, :headers => true) do |row| # want to start with index*1000 
        hash = row.to_hash
        if if i>= index*1000 + 1000
             Table.import arr_hash
             arr_hash = []
             break if i>= index*1000 + 1000
        end
        arr_hash<<Table.new(hash)
    end
    if arr_hash
      Table.import arr_hash
    end
}

【问题讨论】:

  • 欢迎来到 stackoverflow 社区。您能否展示一些代码或到目前为止您对您的问题所做的研究?
  • 请查看有问题的变化
  • 你可以看看使用带有 Enumerator::Lazy blog.honeybadger.io/… 的 File 类。然后用 CSV::Row 处理这些行。只是一个想法☺️

标签: ruby-on-rails ruby csv rubygems


【解决方案1】:

您可以使用Smarter CSV轻松完成工作

SmarterCSV.process('csv_file_path', {:col_sep => ",", :force_utf8 => true, :chunk_size => 1000}) do |chunk|
  # process your chunk here
  # assign each chunk to a Job to process 1000 rows per job
end

【讨论】:

  • 我认为这不起作用,因为我想在插入行之前验证数据并且我正在生成作业来处理行块,因此建议使用索引到索引。感谢您的帮助
  • @Tell_404_not_today 您在第一个块上方的代码中提到“例如,第一个作业读取 0 到 1000 行,其他作业读取 1000 到 2000 行”将是第一个作业运行 0 到 2000 行,下一个块将是下一个作业运行 2000 到 4000 行。这正是你想要的,对吧?抱歉,我将 chunk_size 设置为 2000,但您可以将其更改为 1000
  • @ tkhuynh 根据我理解你的回答,实际上我不能在工作中给出 1000 行的参数,因为它对于参数来说太大了。所以,我必须给出文件路径并根据索引读取行。
猜你喜欢
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 2020-11-12
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
相关资源
最近更新 更多