【问题标题】:CSV - pulling data and writing to another CSV in rubyCSV - 在 ruby​​ 中提取数据并写入另一个 CSV
【发布时间】:2018-10-25 18:24:49
【问题描述】:

我有一个名为“texas_boundaries.csv”的大文件,它由描述数百个学校出勤边界的 lat/lng 对组成。这是一个 800+MB 的文件,并且太大而无法上传到 heroku。我只需要某些学校的边界,所以我试图只找到我需要的行并使用以下代码将它们写入一个新文件:

desc "Reduce texas csv to only needed schools"
task :reduce_texas => :environment do

  require 'csv'

  file = "texas_boundaries.csv"
  headers = CSV.open(file, &:readline)
  nces_ids = School.pluck(:nces_id).uniq
  nces_ids_track = nces_ids
  file_name = 'texas_reduced_boundaries.csv'

  CSV.open(file_name, 'a') do |csv|
    csv << headers
  end

  CSV.foreach(file, :headers => true, encoding: "UTF-8") do |row|
    if nces_ids.include?(row['ncessch'])
      CSV.open(file_name, 'a') do |csv|
        csv << row
        p row['ncessch']
        nces_ids_track.delete(row['ncessch'])
      end
    end
  end

  p "Nces_ids not in reduced boundaries file: #{nces_ids_track.count}"
  p nces_ids_track

end

每个学校都有几十个点来描述它的边界,但是当我运行这段代码时,新文件中只记录了一个点。控制台输出证明了这一点,我希望相同的 nces_id 在更改为新的 nces_id 之前多次出现。

tomb$ rake reduce_texas
"480000801507"
"480000801508"
"480000806094"
"480000806989"
"480000811280"
"480000905246"

这是实际数据文件的屏幕截图,显示有许多行 nces_id = 480000801507。

只有第一行记录在新文件中。

任何帮助将不胜感激!附带说明一下,这个过程非常缓慢,所以如果有读者看到加快速度的方法,请告诉我。

【问题讨论】:

  • 不应删除nces_ids_track.delete(row['ncessch'])。您需要继续为具有相同 id 的多行获取数据
  • @BlairAnderson,感谢您的评论!我用nces_ids 而不是nces_ids_track 获取数据,对吧?
  • 接受的答案是正确的!

标签: ruby-on-rails csv export-to-csv


【解决方案1】:

这看起来很可疑:

nces_ids = School.pluck(:nces_id).uniq
nces_ids_track = nces_ids

分配不复制nces_ids 数组,它只是复制引用。结果是nces_idsnces_ids_track 引用了同一个数组。稍后你这样做:

if nces_ids.include?(row['ncessch'])
  CSV.open(file_name, 'a') do |csv|
    #...
    nces_ids_track.delete(row['ncessch'])
  end
end

但是nces_idsnces_ids_track 引用的是同一个数组,而不是预期的不同数组。

也许你想说:

nces_ids = School.pluck(:nces_id).uniq
nces_ids_track = nces_ids.dup
# -----------------------^^^^

这样您就可以使用数组的两个副本。

【讨论】:

  • 是的,该代码确实非常可疑。你的建议很完美,谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多