我有一个包含一个或多个 key:value 行的文件,如果 key=foo,我想拉出一个 key:value。我怎样才能做到这一点?
我可以做到这一点:
if File.exist?('/file_name')
content = open('/file_name').grep(/foo:??/)
我不确定 grep 部分,而且一旦我得到内容,如何提取值?
我有一个包含一个或多个 key:value 行的文件,如果 key=foo,我想拉出一个 key:value。我怎样才能做到这一点?
我可以做到这一点:
if File.exist?('/file_name')
content = open('/file_name').grep(/foo:??/)
我不确定 grep 部分,而且一旦我得到内容,如何提取值?
人们喜欢将文件放入内存中,如果文件总是很小,这是一个合理的解决方案。但是,slurping 是不可扩展的,并且这种做法会导致 CPU 和 I/O 在读取内容时等待过多。
相反,因为您可能在一个文件中有多个匹配项,并且您正在逐行比较内容,所以逐行读取它。线路 I/O 非常快并且避免了可扩展性问题。红宝石File.foreach
是要走的路:
File.foreach('path/to/file') do |li|
puts $1 if li[/foo:\s*(\w+)/]
end
因为没有实际的键/值对样本,我们在黑暗中寻找有效的正则表达式模式,但这是我解决问题的基础。
尝试这个:
IO.readlines('key_values.txt').find_all{|line| line.match('key1')}
我建议将文件读入数组并仅选择您需要的行:
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
说得通?
File.read('file_name')[/foo: (.*)/, 1]
#=> XXXX
value = File.open('/file_name').read.match("key:(.*)").captures[0] rescue nil