我正在尝试将文件内容读取到模式。
示例:Input.txt
#random
[groups]
earth = id\check_id, mars_nedr, id\npo0md, id\cfrtyh
mars = id\koi8khl, id\xzlo09, id\kzlop0
venus= id\vyu890, id\zzgy78, id\jz9lop
[/]
read = check
write =@mars
我需要[groups]
和[/]
之间的数据来获取数组或哈希值并忽略其余数据。我尝试了以下方法:
text = File.open('input.txt', 'r')
text.each_line do |line|
next if line.start_with? '#'
puts line unless (line=="\[\/\]")
end
但它打印整个文件内容。任何帮助都会有所帮助。
答案 0 :(得分:4)
对于Ruby着名的flip-flop来说,这是一个完美的用例:
File.open('input.txt', 'r').each_line do |line|
line = line.strip
next unless (line == '[groups]')..(line == '[/]')
puts line
end
答案 1 :(得分:3)
state = false
File.new("input.txt").each do |line|
state = true if line.start_with?("[groups]")
next unless state
... # do_something
break if line.start_with?("[/]")
end
答案 2 :(得分:1)
无法击败mudasobwa的触发器解决方案,但这是一个使用正则表达式拆分的简单替代方案。 它产生一个像ask一样的哈希。
Hash[*(File.read('./input.txt').split(/\[|\]/)[2].strip.split(/=|\n/))]
给出
# {"earth "=>" id\\check_id, mars_nedr, id\\npo0md, id\\cfrtyh", "mars "=>" id\\koi8khl, id\\xzlo09, id\\kzlop0", "venus"=>" id\\vyu890, id\\zzgy78, id\\jz9lop"}
答案 3 :(得分:0)
答案 4 :(得分:0)
这样的事情可以解决问题:
start_interpreter = false
myhash = {}
File.open('input.txt', 'r') do |infile|
while (line = infile.gets)
if !(line =~ /\[groups\]/).nil?
start_interpreter = true
next
end
break if !(line =~ /\[\/\]/).nil?
if start_interpreter
split_line = line.split('=')
myhash[split_line[0]] = split_line[1]
end
end
end
p myhash