0

ストリームをスキャンして、キーワードを含む行のみを取得したいのですが、これまでのところ...

ERROR_WORDS = ['Error','Invalid','Out of Range']

error_stream = stderr.read
errors = nil
unless error_stream.nil?
   errors = ERROR_WORDS.detect{ |e| error_stream.include? e }

これが含まれていると仮定するとerror_stream...

4/19/12 - 9:00am: Last check, status ok
4/19/12 - 9:15am: File # 456 received contained Error
4/19/12 - 9:30am: Last check, status ok
4/19/12 - 9:45am: File # 457 is has an Invalid timestamp

errors...ストリームをスキャンして、キーワードのいずれかを含む行のみ (完全に) に戻りたいERROR_WORDSので、この場合、2 行目と 4 行目だけにエラー ワードが含まれます。

考え直しerrorsて、おそらく配列である必要があります...

4/19/12 - 9:15am: File # 456 received contained Error
4/19/12 - 9:45am: File # 457 is has an Invalid timestamp

私のコードはこれを返します...

Error
Invalid
4

1 に答える 1

1

1 つの大きな文字列ではなく、最初に入力を行として読み取る方が簡単です。

テストを実行するには、いくつかの異なるオプションがあります。毎回 ERROR_WORDS 配列をループできますが、代わりに正規表現を作成する方がおそらく効率的です。

ERROR_REGEXP = Regexp.new(ERROR_WORDS.join '|')

次に、コードは次のようになります。

error_lines = stderr.readlines
errors = error_lines.find_all { |line| line =~ ERROR_REGEXP }

それでもエラー ストリーム全体を 1 つの大きな文字列として必要な場合は、次のようにビルドできます。

error_stream = error_lines.join "\n"

一方、一致する行だけが必要な場合は、すべてを一度に実行できます。

errors = stderr.readlines.find_all { |line| line =~ ERROR_REGEXP }
于 2012-04-19T19:48:19.850 に答える