文件中的行包含!
。我需要所有其他线路。我只想在文件中打印不以感叹号开头的行。
到目前为止我写的代码行是:
unless parts.each_line.split("\n" =~ /^!/)
# other bit of nested code
end
但它不起作用。我该怎么做?
答案 0 :(得分:2)
首先,我要使用:
File.foreach('foo.txt') do |li|
next if li[0] == '!'
puts li
end
foreach
非常快,允许您的代码处理任何大小的文件 - "可扩展"是这个词。见" Why is "slurping" a file not a good practice?"了解更多信息。
li[0]
是Ruby中常见的习惯用语,用于获取字符串的第一个字符。同样,它非常快,是我最喜欢的方式,但考虑这些测试:
require 'fruity'
STR = '!' + ('a'..'z').to_a.join # => "!abcdefghijklmnopqrstuvwxyz"
compare do
_slice { STR[0] == '!' }
_start_with { STR.start_with?('!') }
_regex { !!STR[/^!/] }
end
# >> Running each test 32768 times. Test will take about 2 seconds.
# >> _start_with is faster than _slice by 2x ± 1.0
# >> _slice is similar to _regex
使用start_with?
(或其字符串结束等效end_with?
)的速度提高了一倍,从现在开始,我似乎正在使用start_with?
和end_with?
将其与foreach
相结合,您的代码将有可能快速有效。
参见" What is the fastest way to compare the start or end of a String with a sub-string using Ruby?"了解更多信息。
答案 1 :(得分:0)
您可以使用string#start_with
查找以特定字符串开头的行。
file = File.open('file.txt').read
file.each_line do |line|
unless line.start_with?('!')
print line
end
end
您还可以检查第一个字符的索引
unless line[0] === "!"
您也可以使用Regex
执行此操作unless line.scan(/^!/).length