Ruby - 如何在读取文件时跳过/忽略特定行?

时间:2013-04-13 21:36:05

标签: ruby parsing cucumber lines skip

在读取/解析文件时(使用Ruby)忽略某些行的最佳方法是什么?

我正在尝试从Cucumber .feature文件中解析场景,并希望跳过不以Scenario / Given / When / Then / And / But开头的行。

以下代码有效,但这很荒谬,所以我正在寻找一个智能解决方案:)

File.open(file).each_line do |line|
  line.chomp!
  next if line.empty? 
  next if line.include? "#"
  next if line.include? "Feature" 
  next if line.include? "In order" 
  next if line.include? "As a" 
  next if line.include? "I want"

5 个答案:

答案 0 :(得分:5)

你可以这样做:

a = ["#","Feature","In order","As a","I want"]   
File.open(file).each_line do |line|
  line.chomp!
  next if line.empty? || a.any? { |a| line =~ /#{a}/ }
end

答案 1 :(得分:3)

start_with?方法接受多个参数:

File.open(file).each_line do |line|
  next unless line.start_with? 'Scenario', 'Given', 'When', 'Then', 'And', 'But'
  # do something with line.
end

答案 2 :(得分:1)

使用正则表达式来实现紧凑性

您可以使用使用交替的单个正则表达式替换当前大部分循环。您可能还希望将String#chomp!用作条件表达式的一部分。例如:

File.open(file).each do |line|
  next if line.chomp! =~ /^$|#|Feature|In order|As a|I want/
  # something else
end

这可以减少六行代码。无论你是否觉得这种选择更容易阅读,它肯定更短,更具有惯用性。您的里程可能会有所不同。

答案 3 :(得分:0)

这不是那么多帮助,但是,您可以使用数组交集来减少代码。

words = ["#", "Feature", "In order", "As a", "I want"]

File.open(file).each_line do |line|
  line.chomp!
  next if line.empty? || !(line.split & words).empty?

答案 4 :(得分:0)

使用abstract method refctoring方法!您可以在抽象方法中使用技术,聪明或不那么聪明的东西。

File.open(file).each_line do |line|
         line.chomp!
         next if ignore(line)
end

def ignore line
#do whatever you like here, clever or straightforward. 
#All the techniques others has posted could be applied here
end