我有一个这样的文本文件:
User accounts for \\AGGREP-1
-------------------------------------------------------------------------------
Administrator users grzesieklocal
Guest scom SUPPORT_8855
The command completed successfully.
第一行是空行。我想删除此文件中的每一个空行,每行包含单词"用户帐户"," -------","命令&#34 ;。我想只有包含用户的行。我不想只删除前4行和最后一行,因为在某些系统中可能会有更多用户,文件将包含更多行。 我使用
加载文件a = IO.readlines("test.txt")
有没有办法删除包含特定单词的行?
答案 0 :(得分:1)
IO::readlines
会返回一个数组,因此您可以使用Array#select
来选择所需的行。请记住,这意味着您的整个输入文件将在内存中,如果文件非常大,这可能是个问题。
另一种方法是使用IO::foreach
,它一次处理一行:
selected_lines = []
IO.foreach('test.txt') { |line| selected_lines << line if line_matches_your_requirements }
答案 1 :(得分:1)
此结构逐行读取文件,并直接写入新文件:
def unwanted?(line)
line.strip.empty? ||
line.include?('User accounts') ||
line.include?('-------------') ||
line.include?('The command completed')
end
File.open('just_users.txt', 'w+') do |out|
File.foreach('test.txt') do |line|
out.puts line unless unwanted?(line)
end
end
如果您熟悉regexp,可以使用:
def unwanted?(line)
line =~ /^(User accounts|------------|The command completed|\s*$)/
end
尝试使用时会显示消息warning: string literal in condition
:
string = "nothing"
if string.include? "a" or "b"
puts "FOUND!"
end
输出:
parse_text.rb:16: warning: string literal in condition
FOUND!
因为应该写:
string = 'nothing'
if string.include?('a') || string.include?('b')
puts "FOUND!"
end
有关详细信息,请参阅this问题。