我正在尝试做与此问题相似的事情:Parse a CSV file, update a field, then save
基本上我有一个CSV,每行都有一个逗号分隔的IP列表,每行代表一个不同的IP组。我将此CSV传递给一个函数,该函数对每行的每个IP执行一些操作。之后,我想在行中附加状态和时间戳。上面的解决方案需要创建第二个文件,有没有办法在不创建附加文件的情况下执行此操作,只需附加到每一行?
CSV.open('csv_with_ips.csv', 'r+').each do |row|
<do some stuff>
row << 'SCANNED'
row << Time.now
end
答案 0 :(得分:3)
您没有 来创建新文件,但良好做法表明您应该这样做。
使用较长的行更新行需要操作系统覆盖以下行和可能的后续行。如果代码在处理整个文件之前崩溃,则内容将被破坏。
另外,做你想做的事情意味着你必须将整个文件读入内存,这不是一个好主意,因为你的代码不会很好地扩展。如果你没有把它读进内存,你写的那一行就会踩到你要读的下一行,破坏它。
安全处理数据会是这样的:
File.open('output.csv', 'w') do |fo|
File.foreach('input.csv') do |li|
# modify the input line "li"
fo.puts(li)
end
end
File.mv('input.csv', 'input.csv.bak')
File.mv('output.csv', 'input.csv')
但是,当然,您希望利用Ruby附带的CSV class并让它处理繁重的工作。 CSV文件格式并不像人们想象的那么简单,并且很容易弄乱数据,因此可以利用CSV类实现的功能。