我想从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
为什么它不能读取文件?删除前两行后,是否需要显式关闭文件?
答案 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)
?