Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails CSV-在ruby中提取数据并写入另一个CSV_Ruby On Rails_Csv_Export To Csv - Fatal编程技术网

Ruby on rails CSV-在ruby中提取数据并写入另一个CSV

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

我有一个名为“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_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
,对吗?接受的答案是正确的!是的,那密码确实很可疑。你的建议很好,谢谢!是的,那密码确实很可疑。你的建议很好,谢谢!