【问题标题】:How to nicely read "alternating" lines?如何很好地阅读“交替”行?
【发布时间】:2018-08-27 21:43:22
【问题描述】:

我有一个文本文件,其中包含遵循替代模式的行,例如:

name: SomeName 
counterA: 0, counterB: 0, counterC: 0
name: SomeNameB 
counterA: 1, counterB: 2, counterC: 3
...

我想编写一个简单的解析器,将 SameName 和计数器 A 到 C 推送到一个新对象中。

所以任务基本上是总是一起处理两条行。

我从这段代码开始:

fun readFileAsLinesUsingReadLines(fileName: String): List<String> = File(fileName).readLines()

fun main(args: Array<String>) {
    val lines = readFileAsLinesUsingReadLines("Whatever")
    for (i in (0 .. lines.size-1 step 2)) {
        println(lines[i]+lines[i+1])
    }
}

是的,打印出来的

name: SomeName counterA: 0, counterB: 0, counterC: 0

然后我可以进一步解析。

但我发现(0 .. lines-size-1 step) 的用法不是很优雅。

是否有更优雅或“更多 kotlin”的方式来提取这些信息?

【问题讨论】:

    标签: file parsing kotlin


    【解决方案1】:

    使用useLines,您可以将行读取为(惰性)序列,然后将chunked 与转换 lambda 一起使用,以按照您认为合适的方式进行解析和格式化:

    val result = File("file.txt").useLines { lines ->
        lines.chunked(2) { (l1, l2) -> l1 + l2 }.toList()
    }
    
    result.forEach { println(it) }
    

    如果出于某种原因,您希望首先将所有内容流式传输到内存中,您还可以将readLines 与基于列表的chunked 版本一起使用:

    val result = File("file.txt").readLines().chunked(2) { (l1, l2) -> l1 + l2 }
    
    result.forEach { println(it) }
    

    【讨论】:

    • 如果你不需要懒惰,chunked 也可以处理readLines 调用返回的List&lt;String&gt;
    • 非常好,谢谢。尤其是 chunked 也适用于列表。
    • 在您的useLines 版本中,您不应该在右括号后添加.toList() 吗?
    • @RobbyCornelissen 流在 useLines 之后关闭,因此之后行的打印将不会成功。因此,要么在 lambda 中打印,要么在之后转换为列表并打印。
    • @Roland 我在 Linux 上。一旦我再次落后于PC,将重新测试。现在将添加toList()
    【解决方案2】:

    另一种方式:

    (0 until lines.size).filter { it % 2 == 0 }.forEach { println(lines[it] + lines[it+1]) }
    

    或者按照罗兰的喜好:

    lines.indices.filter { it % 2 == 0 }.forEach { println(lines[it] + lines[it+1]) }
    

    【讨论】:

    • 赞赏,但我发现另一种答案方式更优雅;-)
    • 如果您只想使用indices,您也可以致电lines.indices.filter ...。一个替代方案:lines.forEachIndexed { i, s-&gt; if (i%2==0) print(s) else println(s) }... 但我认为chunked()-方法更清楚。此外,使用解构列表,它也变得更具可读性(取决于您要给出的名称 ;-))。
    • @Roland 当然有很多方法可以处理和过滤索引,并且分块方法很清楚,只是事情的简单性让我更喜欢索引方式。
    • 在问题中是否从0开始是事实。
    • 所以您认为对于具有基于 1 的索引语言背景的人来说,看到 indices 而不是 0 until lines.size 会更好?
    猜你喜欢
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2018-07-05
    • 2019-08-29
    • 1970-01-01
    • 2021-10-16
    • 2021-03-26
    • 2013-10-08
    相关资源
    最近更新 更多