Ruby on rails CSV-在ruby中提取数据并写入另一个CSV
我有一个名为“texas_Bounders.csv”的大文件,它由描述数百个入学边界的lat/lng对组成。这是一个800+MB的文件,太大,无法上传到heroku。我只需要某些学校的边界,因此我尝试只找到我需要的行,并使用以下代码将它们写入新文件:Ruby on rails CSV-在ruby中提取数据并写入另一个CSV,ruby-on-rails,csv,export-to-csv,Ruby On Rails,Csv,Export To Csv,我有一个名为“texas_Bounders.csv”的大文件,它由描述数百个入学边界的lat/lng对组成。这是一个800+MB的文件,太大,无法上传到heroku。我只需要某些学校的边界,因此我尝试只找到我需要的行,并使用以下代码将它们写入新文件: desc "Reduce texas csv to only needed schools" task :reduce_texas => :environment do require 'csv' file = "texas_bo
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=48000801507
新文件中只记录第一行
任何帮助都将不胜感激!顺便说一句,这个过程非常缓慢,因此如果有读者看到加快速度的方法,请告诉我。这看起来很可疑:
nces_ids = School.pluck(:nces_id).uniq
nces_ids_track = nces_ids
赋值不复制nces\u id
数组,它只复制引用。结果是nces\u id
和nces\u id\u track
引用同一数组。稍后您将执行以下操作:
if nces_ids.include?(row['ncessch'])
CSV.open(file_name, 'a') do |csv|
#...
nces_ids_track.delete(row['ncessch'])
end
end
但是nces\u id
和nces\u id\u track
引用相同的数组,而不是预期的不同数组
也许你想说:
nces_ids = School.pluck(:nces_id).uniq
nces_ids_track = nces_ids.dup
# -----------------------^^^^
因此,您有两个阵列副本要使用。这看起来可疑:
nces_ids = School.pluck(:nces_id).uniq
nces_ids_track = nces_ids
赋值不复制nces\u id
数组,它只复制引用。结果是nces\u id
和nces\u id\u track
引用同一数组。稍后您将执行以下操作:
if nces_ids.include?(row['ncessch'])
CSV.open(file_name, 'a') do |csv|
#...
nces_ids_track.delete(row['ncessch'])
end
end
但是nces\u id
和nces\u id\u track
引用相同的数组,而不是预期的不同数组
也许你想说:
nces_ids = School.pluck(:nces_id).uniq
nces_ids_track = nces_ids.dup
# -----------------------^^^^
因此,您有两个数组副本要使用。不应删除
nces\u id\u track.delete(行['ncessch'])
。您需要继续为多个具有相同属性的行获取数据id@BlairAnderson,谢谢你的评论!我正在用nces\u id
获取数据,而不是nces\u id\u track
,对吗?接受的答案是正确的!不应删除nces\u id\u轨迹。删除(行['ncessch'])
。您需要继续为多个具有相同属性的行获取数据id@BlairAnderson,谢谢你的评论!我正在用nces\u id
获取数据,而不是nces\u id\u track
,对吗?接受的答案是正确的!是的,那密码确实很可疑。你的建议很好,谢谢!是的,那密码确实很可疑。你的建议很好,谢谢!