2017-04-19 7 views
2

私はファイルストリームの処理を頭に入れようとしています。ファイルを反復処理し、パターンで分割する

bla 
blubb 

blubber 
testcode 

上記のようなファイルがいくつかあります。今、私はメモリにファイル全体を読み込み、それを分割し、単一のファイルのアプローチを使用しています:

Files.newBufferedReader("myfile").use { f -> 
    f.readText().splitToSequence("\n\n").forEach { 
     // do my stuff 
    } 
} 

、私はそれは非現実的でファイルを保持すること(大きな入力にこれを一般化しようとしていますメモリ)といくつかのファイル。理想的には、入力ファイルのディレクトリ全体を、私が\n\nに分割した行の1つのストリームとして扱い、その部分を処理します。どうすればいい?

+0

Iliaの答えが難しいKotlinの部分を解決している間、私は "InputStreamReader(SequenceInputStream(com.google.common.collect.Iterators.asEnumeration)")を使って "ファイルのディレクトリを行のストリームとして扱う" (Files.list( "myDir")。map {Files.newInputStream(it)} .iterator()))、Charsets.US_ASCII).useLines {...} ' – mabi

答えて

4

あなたはテキスト行のシーケンスとしてファイルを読み、区切り文字として空行を取って、それらの行に再編成することができます。各要素があるのはここ

File("myfile").useLines { lines -> 
    val lineBlocks: Sequence<List<String>> = buildSequence { 
     val block = mutableListOf<String>() 
     for (line in lines) { 
      when { 
       line.isNotEmpty() -> block.add(line) 
       block.isNotEmpty() -> { 
        yield(block.toList()) 
        block.clear() 
       } 
      } 
     } 
     if (block.isNotEmpty()) yield(block.toList()) 
    } 

    lineBlocks.forEach { 
     println(it.joinToString()) 
    } 
} 

はあなたがlineBlocksで結果を取得し、配列であります1つのブロック内の行のリスト。

+0

コルーチンを実行してください!そして、「いつか」の賢い応用に感謝します。 – mabi