1

「キー \t 値」の形式の tsv ファイルがあり、マップに読み込む必要があります。現在、私はこのようにしています:

referenceFile.eachLine { line ->
    def (name, reference) = line.split(/\t/)
    referencesMap[name.toLowerCase()] = reference
}

それを行うためのより短い/より良い方法はありますか?

4

3 に答える 3

1

これは、melix の回答に追加された tim_yates のコメントであり、最短/明確な回答だと思います。

referenceFile.collect { it.tokenize( '\t' ) }.collectEntries { k, v -> [ k.toLowerCase(), v ] }
于 2013-04-25T06:42:13.573 に答える
1

私が考えることができる唯一の他の方法は、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

引用符で囲まれた文字列を扱うため

于 2013-04-24T12:18:03.580 に答える