【发布时间】: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