「キー \t 値」の形式の tsv ファイルがあり、マップに読み込む必要があります。現在、私はこのようにしています:
referenceFile.eachLine { line ->
def (name, reference) = line.split(/\t/)
referencesMap[name.toLowerCase()] = reference
}
それを行うためのより短い/より良い方法はありますか?
「キー \t 値」の形式の tsv ファイルがあり、マップに読み込む必要があります。現在、私はこのようにしています:
referenceFile.eachLine { line ->
def (name, reference) = line.split(/\t/)
referencesMap[name.toLowerCase()] = reference
}
それを行うためのより短い/より良い方法はありますか?
これは、melix の回答に追加された tim_yates のコメントであり、最短/明確な回答だと思います。
referenceFile.collect { it.tokenize( '\t' ) }.collectEntries { k, v -> [ k.toLowerCase(), v ] }
私が考えることができる唯一の他の方法は、Commons IO で見られるような Iterator を使用することです。
@Grab( 'commons-io:commons-io:2.4' )
import org.apache.commons.io.FileUtils
referencesMap = FileUtils.lineIterator( referenceFile, 'UTF-8' )
.collectEntries { line ->
line.tokenize( '\t' ).with { k, v ->
[ (k.toLowerCase()): v ]
}
}
または CSV パーサーを使用する場合:
@Grab('com.xlson.groovycsv:groovycsv:1.0')
import static com.xlson.groovycsv.CsvParser.parseCsv
referencesMap = referenceFile.withReader { r ->
parseCsv( [ separator:'\t', readFirstLine:true ], r ).collectEntries {
[ (it[ 0 ].toLowerCase()): it[ 1 ] ]
}
}
しかし、どちらも短くはありませんし、必ずしも優れているとは限りません...
ただし、次のようなケースを処理できるため、オプション 2 を好みます。
"key\twith\ttabs"\tvalue
引用符で囲まれた文字列を扱うため