我正在尝试编写一个ruby脚本,该脚本将读取CSV文件并将信息添加到某些单元格(例如添加文件路径)。我能够很好地打开和改变文本,但是在回写到CSV而没有覆盖所有内容时遇到了问题。这是我到目前为止的样本:
CSV.foreach(path) { |row|
text = row[0].to_s
new_text = "test:#{text}"
}
我想在该块中添加一些内容,然后将new_text
写回文件中的同一个引用单元格(row
)。我必须找到写入文件的唯一方法是
CSV.open(path, "wb") { |row|
row << new_text
}
但我认为这是不好的做法,因为你已经在文件块中重新打开文件了。我有更好的办法吗?
EX:我的CSV文件类似于:
file,destination
test.txt,A101
并且需要它:
file,destination
path/test.txt,id:A101
希望这是有道理的。提前谢谢!
答案 0 :(得分:1)
根据文件的大小,您可以考虑将文件的内容加载到本地变量中,然后对其进行操作,覆盖原始文件。
onclick="button_5a1_list_submit(20, 'value has single quote 'again text');"
或者,如果文件很大,您可以沿着路径将每个修改过的行写入新文件,然后在最后用新文件替换旧文件。
答案 1 :(得分:0)
鉴于您似乎没有做任何利用CSV功能的事情,我建议使用Ruby的“就地”选项变量$-i
。
我使用的某些统计软件只需要数据,而不能处理标题行。这是我写回一段时间(似乎)从命令行中指定的一个或多个数据文件中删除第一行的脚本。
#! /usr/bin/env ruby -w
#
# User supplies the name of one or more files to be "stripped"
# on the command-line.
#
# This script ignores the first line of each file.
# Subsequent lines of the file are copied to the new version.
#
# The operation saves each original input file with a suffix of
# ".orig" and then operates in-place on the specified files.
$-i = ".orig" # specify backup suffix
oldfilename = ""
ARGF.each do |line|
if ARGF.filename == oldfilename # If it's an old file
puts line # copy lines through.
else # If it's a new file remember it
oldfilename = ARGF.filename # but don't copy the first line.
end
end
显然,您希望将puts line
传递更改为您要执行的任何编辑操作。
我喜欢这个解决方案,因为即使你把它搞砸了,你也保留原始文件作为原始名称,并附加.orig
(或你选择的任何后缀)。