2

私はいくつかの助けが必要です。それはいくつかのユニークな解決策です。ある位置に基づいてある値を置き換える必要があるテキスト ファイルがあります。これは大きなファイルではなく、常にすべての行に固定長の 5 行が含まれます。しかし、特定の位置でのみ soem テキストを置き換える必要があります。さらに、必要な位置にテキストを挿入し、そのテキストを毎回必要な値に置き換えることもできます。このソリューションを実装する方法がわかりません。以下に例を示しました。

Line 1 - 00000 This Is Me 12345 trying
Line 2 - 23456 This is line 2 987654
Line 3 - This is 345678 line 3 67890

上記は、いくつかの値を置き換えるために使用する必要があるファイルであると考えてください。1 行目と同様に、'00000' を '11111' に置き換え、2 行目で 'This' を 'Line' に置き換えるか、4 桁のテキストが必要です。テキスト ファイル内の位置は常に同じままです。

機能する解決策がありますが、これは位置に基づいてファイルを読み取るためのものであり、書き込み用ではありません。誰かが同様に位置に基づいて書くための解決策を教えてください

位置に基づいてファイルを読み取るためのソリューション:

def read_var file, line_nr, vbegin, vend 
    IO.readlines(file)[line_nr][vbegin..vend] 
end 

puts read_var("read_var_from_file.txt", 0, 1, 3) #line 0, beginning at 1, ending at 3 
#=>308 

puts read_var("read_var_from_file.txt", 1, 3, 6) 

#=>8522 

私はこの解決策を書いてみました。これは機能しますが、位置に基づいて、または特定の行に存在するテキストに基づいて機能する必要があります。

ファイルに書き込むための調査済みソリューション:

open(Dir.pwd + '/Files/Try.txt', 'w') { |f|
  f << "Four score\n"
  f << "and seven\n"
  f << "years ago\n"
}
4

1 に答える 1

0

私はあなたにワーキングサンプルアナグラジを作りました.

in_file = "in.txt"
out_file = "out.txt"

=begin
=>contents of file in.txt
00000 This Is Me 12345 trying 
23456 This is line 2 987654 
This is 345678 line 3 67890 
=end

def replace_in_file in_file, out_file, shreds
  File.open(out_file,"wb") do |file|
    File.read(in_file).each_line.with_index do |line, index| 
      shreds.each do |shred|
        if shred[:index]==index
          line[shred[:begin]..shred[:end]]=shred[:replace]
        end
      end
      file << line
    end
  end
end    


shreds = [
    {index:0, begin:0, end:4, replace:"11111"},
    {index:1, begin:6, end:9, replace:"Line"}
]

replace_in_file in_file, out_file, shreds

=begin
=>contents of file out.txt
11111 This Is Me 12345 trying 
23456 Line is line 2 987654 
This is 345678 line 3 67890 
=end
于 2012-09-12T08:53:34.297 に答える