1つ以上のkey:value行を含むファイルがあり、key = fooの場合はkey:valueを引き出したいと思います。これどうやってするの?
私はこれまで得ることができます:
if File.exist?('/file_name')
content = open('/file_name').grep(/foo:??/)
grepの部分がわからないのですが、コンテンツを取得したら、どのように値を抽出しますか?
1つ以上のkey:value行を含むファイルがあり、key = fooの場合はkey:valueを引き出したいと思います。これどうやってするの?
私はこれまで得ることができます:
if File.exist?('/file_name')
content = open('/file_name').grep(/foo:??/)
grepの部分がわからないのですが、コンテンツを取得したら、どのように値を抽出しますか?
人々はファイルをメモリに丸呑みするのが好きです。これは、ファイルが常に小さい場合、合理的な解決策です。ただし、スケーラブルではないため、この方法ではCPUが過剰になり、コンテンツが読み取られるときにI/Oが待機する可能性があります。
代わりに、ファイルに複数のヒットがある可能性があり、コンテンツを行ごとに比較しているため、行ごとに読んでください。ラインI/Oは非常に高速で、スケーラビリティの問題を回避します。RubyFile.foreach
は次の方法です。
File.foreach('path/to/file') do |li|
puts $1 if li[/foo:\s*(\w+)/]
end
実際のキーと値のペアのサンプルがないため、有効な正規表現パターンを暗闇で撮影していますが、これが問題を解決する方法の基礎です。
ファイルを配列に読み込んで、必要な行だけを選択することをお勧めします。
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
value
key:
したがって、次のようなファイルがある場合:
key:1
foo
key:2
bar
key:3
次のような結果が得られます。
key = 1
key = 2
key = 3
意味がありますか?
これを試して:
IO.readlines('key_values.txt').find_all{|line| line.match('key1')}
value = File.open('/file_name').read.match("key:(.*)").captures[0] rescue nil
File.read('file_name')[/foo: (.*)/, 1]
#=> XXXX