遍历文件,按模式拆分
Posted
技术标签:
【中文标题】遍历文件,按模式拆分【英文标题】:Iterating over files, splitting by pattern 【发布时间】:2017-09-16 01:19:26 【问题描述】:我正试图围绕文件流处理。得到的输入如下所示:
bla
blubb
blubber
testcode
有几个文件看起来都像上面那样。现在,我正在使用单文件方法,将整个文件读入内存并将其拆分:
Files.newBufferedReader("myfile").use f ->
f.readText().splitToSequence("\n\n").forEach
// do my stuff
现在,我试图将其推广到更大的输入(使得将文件保存在内存中不切实际)和多个文件。理想情况下,我会将整个输入文件目录视为我在\n\n
上拆分的单个行流,然后处理各个部分。我该怎么做?
【问题讨论】:
作为记录,虽然 Ilia 的答案解决了困难的 Kotlin 部分,但我已经用InputStreamReader(SequenceInputStream(com.google.common.collect.Iterators.asEnumeration(Files.list("myDir").map Files.newInputStream(it) .iterator())), Charsets.US_ASCII).useLines ...
解决了“将文件目录视为行流”
【参考方案1】:
您可以将文件读取为一系列文本行,然后以空行作为分隔符重新组合这些行:
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
中的结果,这是一个序列,其中每个元素都是单个块中的行列表。
【讨论】:
去协程!并感谢when
的巧妙应用。以上是关于遍历文件,按模式拆分的主要内容,如果未能解决你的问题,请参考以下文章