更改CSV文件中的信息

时间:2015-05-20 14:26:09

标签: ruby csv

我正在尝试编写一个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

希望这是有道理的。提前谢谢!

2 个答案:

答案 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(或你选择的任何后缀)。