遍历文件,按模式拆分

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 的巧妙应用。

以上是关于遍历文件,按模式拆分的主要内容,如果未能解决你的问题,请参考以下文章

shell怎样随机读写遍历文件中指定分隔符的记录

文件按修改时间和创建时间遍历

文件按修改时间和创建时间遍历

如何用excel vba按关键字选择性的遍历文件夹搜索文件?

PHP遍历目录下的图片,按顺序显示问题

如何告诉ffmpeg按顺序遍历目录中的所有文件