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、置換を行い、結果を破棄しています。これは各行で 1 回行われるため、時間がかかるのも不思議ではありません。

最も簡単な解決策は、ファイル全体を単一の文字列に読み取り、それを使用gsubして内容を変更することです。あなたの例では、(ゼロベースの) ファイル行番号を CDATA に挿入しています。これは間違いだと思います。

このコードは、出現するすべての<![CDATA[{CLONEINCR}]]>など<![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 に答える