迭代文件,按模式分割

时间:2017-04-19 17:10:00

标签: kotlin

我正试图围绕文件流处理。输入看起来像这样:

bla
blubb

blubber
testcode

有几个文件都像上面那样。现在,我正在使用单个文件方法将整个文件读入内存并将其拆分:

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

现在,我试图将其推广到更大的输入(使文件在内存中保存不切实际)和几个文件。理想情况下,我将输入文件的整个目录视为我在\n\n上拆分的单个流行,并处理这些部分。我该怎么做?

1 个答案:

答案 0 :(得分: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中的结果,这是一个序列,其中每个元素都是单个块中的行列表。