读取线条直到模式

时间:2018-02-07 13:42:44

标签: ruby

我正在尝试将文件内容读取到模式。

示例: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

但它打印整个文件内容。任何帮助都会有所帮助。

5 个答案:

答案 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)

  1. #之后你不需要下一个,对吗?它必须是'[group]'
  2. 之后的下一个
  3. 如果达到某种结束条件,你需要“打破”循环,但目前你只是不打印它并转移到下一行

答案 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