Ruby / Rake:为什么未打开CSV文件以供阅读?

时间:2019-08-10 13:18:36

标签: ruby file csv rake

我想从CSV文件中删除前两行,并添加自己的标题。我已经把它包装在一个耙子任务中。

task :fix_csv do
  # copy to temp file
  cp ENV['source'], TMP_FILE

  # drop header rows
  table = CSV.table(TMP_FILE)
  File.open(TMP_FILE, 'w') do |f|
    f.write(table.drop(2).to_csv)
  end

  # add new header
  CSV.open(TMP_FILE, 'w', force_quotes: true) do |csv|
    csv << HEADERS if csv.count.eql? 0
  end

  puts 'Done!'
end

但是,此操作失败并显示错误:

rake aborted!
IOError: not opened for reading
../rakefile.rb:54:in `count'

第54行是:

csv << HEADERS if csv.count.eql? 0

为什么它不能读取文件?删除前两行后,是否需要显式关闭文件?

1 个答案:

答案 0 :(得分:0)

第二次打开文件仅用于写入,但是随后您尝试迭代访问内容(即通过查询行数):

#                  ⇓⇓⇓
CSV.open(TMP_FILE, 'w', force_quotes: true) do |csv|
#                       ⇓⇓⇓⇓⇓
  csv << HEADERS if csv.count.eql? 0
end

虽然很容易解决,但我想问一问,完全忘记CSV会带来什么问题,而建议使用类似以下内容的

old = File.readlines(FILE_NAME).drop(2)
old[0...0] = HEADERS.join(',')
File.write(FILE_NAME, old)