0

我有一个包含一个或多个 key:value 行的文件,如果 key=foo,我想拉出一个 key:value。我怎样才能做到这一点?

我可以做到这一点:

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

我不确定 grep 部分,而且一旦我得到内容,如何提取值?

4

5 回答 5

1

人们喜欢将文件放入内存中,如果文件总是很小,这是一个合理的解决方案。但是,slurping 是不可扩展的,并且这种做法会导致 CPU 和 I/O 在读取内容时等待过多。

相反,因为您可能在一个文件中有多个匹配项,并且您正在逐行比较内容,所以逐行读取它。线路 I/O 非常快并且避免了可扩展性问题。红宝石File.foreach是要走的路:

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

因为没有实际的键/值对样本,我们在黑暗中寻找有效的正则表达式模式,但这是我解决问题的基础。

于 2012-11-30T05:02:17.210 回答
0

尝试这个:

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