2

ボックスに telnet で接続し、コマンドを実行し、出力を保存するスクリプトがあります。その後、出力ファイルを解析する別のスクリプトを実行し、別のファイルにあるキーワードと比較して一致させます。行が一致した場合、行全体 (元の telnet 出力から) を新しいファイルに保存する必要があります。

テキストの解析を扱うスクリプトの一部を次に示します。

def parse_file
    filter = []
    temp_file = File.open('C:\Ruby193\scripts\PARSED_TRIAL.txt', 'a+')
    t = File.open('C:\Ruby193\scripts\TRIAL_output_log.txt')
    filter = File.open('C:\Ruby193\scripts\Filtered_text.txt').readlines
    t.each do |line|
        filter.each do |segment|
            if (line =~ /#{segment}/)
                temp_file.puts line
            end
        end
    end
    t.close()
    temp_file.close()
end

現在、配列にある最後の実行文字列のみを保存し、それをにfilter保存していtemp_fileます。ループが配列内のすべての文字列を実行していないか、すべてを保存していないようです。テキスト ファイル内に 5 つの文字列が配置されていますFiltered_text.txt。最後に一致した行のみを に出力しtemp_fileます。

4

1 に答える 1

4

これ (テストされていないコード) は元のコードを複製しますが、より簡潔かつ慣用的にのみ:

filter = Regexp.union(File.open('C:\Ruby193\scripts\Filtered_text.txt').readlines.map(&:chomp))
File.open('C:\Ruby193\scripts\PARSED_TRIAL.txt', 'a+') do |temp_file|
  File.foreach('C:\Ruby193\scripts\TRIAL_output_log.txt') do |l|
    temp_file.puts l if (l[filter])
  end
end

何が起こっているのかを理解するには:

Regexp.union(%w[a b c])
=> /a|b|c/

これにより、文字列を調べて部分文字列の一致を探す正規表現が得られます。大文字と小文字を区別する検索です。

これらの穴を閉じたい場合は、次のようなものを使用します。

Regexp.new(
  '\b' + Regexp.union(
    File.open('C:\Ruby193\scripts\Filtered_text.txt').readlines.map(&:chomp)
  ).source + '\b',
  Regexp::IGNORECASE
)

上記と同じサンプル入力配列を使用すると、次のようになります。

/\ba|b|c\b/i
于 2012-10-22T19:27:50.593 に答える