0

我正在尝试通过查找此字符串来更改文件:

<aspect name=\"lineNumber\"><![CDATA[{CLONEINCR}]]>

并用{CLONEINCR}递增的数字替换。这是我到目前为止所拥有的:

file = File.open('input3400.txt' , 'rb')
contents = file.read.lines.to_a
contents.each_index do |i|contents.join["<aspect name=\"lineNumber\"><![CDATA[{CLONEINCR}]]></aspect>"] = "<aspect name=\"lineNumber\"><![CDATA[#{i}]]></aspect>" end
file.close

但这似乎永远持续下去——我在某处有无限循环吗?

注意:我的文本文件长 533,952 行。

4

2 回答 2

1

您反复连接 的所有元素contents,进行替换并丢弃结果。每条线路都发生一次,所以难怪它需要很长时间。

最简单的解决方案是将整个文件读入一个字符串并使用gsub它来修改内容。在您的示例中,您将(从零开始的)文件行号插入到 CDATA 中。我怀疑这是一个错误。

此代码将所有出现的<![CDATA[{CLONEINCR}]]>with<![CDATA[1]]>等替换<![CDATA[2]]>为找到的每个匹配 CDATA 的递增数字。修改后的文件被发送到 STDOUT。希望这就是你所需要的。

File.open('input3400.txt' , 'r') do |f|
  i = 0
  contents = f.read.gsub('<![CDATA[{CLONEINCR}]]>') { |m|
    m.sub('{CLONEINCR}', (i += 1).to_s)
  }
  puts contents
end
于 2013-10-17T23:11:59.030 回答
0

如果您想要将 CLONEINCR 替换为行号,这就是您上面的代码正在尝试执行的操作,那么这将起作用。否则请参阅鲍罗丁的回答。

output = File.readlines('input3400.txt').map.with_index do |line, i|
  line.gsub "<aspect name=\"lineNumber\"><![CDATA[{CLONEINCR}]]></aspect>",
    "<aspect name=\"lineNumber\"><![CDATA[#{i}]]></aspect>"
end
File.write('input3400.txt', output.join(''))

此外,您应该知道,当您将这些行读入 时contents,您正在创建一个String与文件不同的内容。您不能直接对文件进行操作。相反,您必须创建一个String包含所需内容的新文件,然后覆盖原始文件。

于 2013-10-17T23:11:36.537 回答