在Ruby

时间:2016-12-19 10:47:17

标签: ruby string

我有一个这样的文本文件:

User accounts for \\AGGREP-1

-------------------------------------------------------------------------------
Administrator            users                    grzesieklocal
Guest                    scom                     SUPPORT_8855
The command completed successfully.

第一行是空行。我想删除此文件中的每一个空行,每行包含单词"用户帐户"," -------","命令&#34 ;。我想只有包含用户的行。我不想只删除前4行和最后一行,因为在某些系统中可能会有更多用户,文件将包含更多行。 我使用

加载文件
a = IO.readlines("test.txt")

有没有办法删除包含特定单词的行?

2 个答案:

答案 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问题。