1

ソース ファイルはタブ区切りで、4 列目の値を grep する必要があります。Groovyでこれを行うにはどうすればよいですか? 動作しない私のコードは次のとおりです。それも近いですか?

 def tab_file = new File('source_file.tab')
 tab_file.eachline { line -> println line.grep('\t\t\t\t'} 
4

2 に答える 2

3

タブ文字で分割すると、列を取得するためにインデックスを作成できる配列が得られます。

groovy:000> s = "aaa\tbbb\tccc\tddd\teee";
===> aaa        bbb     ccc     ddd     eee
groovy:000> s.split("\\t")[3]
===> ddd
于 2012-11-27T17:43:01.427 に答える
2

次のようなものが機能するはずです。

tab_file.eachLine { line -> 
    println ((line =~ /([^\t]*\t){3}([^\t]*)/)[0][2])
} 

説明:=~オペレーターはjava.util.regex.Matcher右側のパターンを使用してオブジェクトを 作成します。find()Groovy では、配列添字演算子を介して暗黙的に実行できます。正規表現にグループが含まれている場合、結果はListfor each になります。このリストには、一致した領域全体が要素 0 として含まれ、グループがさらに要素として含まれます。正規[0][2]表現 (ゼロ インデックス) の最初の一致、特に 2 番目のグループの一致も同様です。(ところで、正規表現にグループがなかった場合、結果は一致する単なる文字列になります)。詳細/例はこちら.

更新/脇:興味があったので、 Objectに追加さ れたgrep()fxnalityを調べていました。コレクション型の外でこのユーティリティが表示されるかどうかはわかりませんが、文字列に適用すると、期待どおりに動作しません。文字列内の文字をループして、各文字を渡された文字と比較するように見えます。文字列 (リスト内の一致を収集)。渡された文字列が1文字を超える場合、反復ごとに検査中の文字が渡された文字列全体と等しくなることはないため、一致することはありません(例では、 any )\t != "\t\t\t\t"

于 2012-11-27T17:56:17.120 に答える