0

1つ以上のkey:value行を含むファイルがあり、key = fooの場合はkey:valueを引き出したいと思います。これどうやってするの?

私はこれまで得ることができます:

if File.exist?('/file_name')
  content = open('/file_name').grep(/foo:??/)

grepの部分がわからないのですが、コンテンツを取得したら、どのように値を抽出しますか?

4

5 に答える 5

1

人々はファイルをメモリに丸呑みするのが好きです。これは、ファイルが常に小さい場合、合理的な解決策です。ただし、スケーラブルではないため、この方法ではCPUが過剰になり、コンテンツが読み取られるときにI/Oが待機する可能性があります。

代わりに、ファイルに複数のヒットがある可能性があり、コンテンツを行ごとに比較しているため、行ごとに読んでください。ラインI/Oは非常に高速で、スケーラビリティの問題を回避します。RubyFile.foreachは次の方法です。

File.foreach('path/to/file') do |li|
  puts $1 if li[/foo:\s*(\w+)/]
end

実際のキーと値のペアのサンプルがないため、有効な正規表現パターンを暗闇で撮影していますが、これが問題を解決する方法の基礎です。

于 2012-11-30T05:02:17.210 に答える
0

ファイルを配列に読み込んで、必要な行だけを選択することをお勧めします。

regex = /\A\s?key\s?:/
results = File.readlines('file').inject([]) do |f,l|
  l =~ regex ? f << "key = %s" % l.sub(regex, '') : f
end

これにより、で始まり、次のような結果に追加される行が検出さkey:れます。key = value
valuekey:

したがって、次のようなファイルがある場合:

key:1
foo
key:2
bar
key:3

次のような結果が得られます。

key = 1
key = 2
key = 3

意味がありますか?

于 2012-11-29T21:26:24.467 に答える
0

これを試して:

IO.readlines('key_values.txt').find_all{|line| line.match('key1')}
于 2012-11-29T21:28:38.397 に答える
0
value = File.open('/file_name').read.match("key:(.*)").captures[0] rescue nil
于 2012-11-29T21:49:53.187 に答える
0
File.read('file_name')[/foo: (.*)/, 1]
#=> XXXX
于 2012-11-29T22:44:49.427 に答える