如何很好地阅读“交替”行?

时间:2018-08-27 09:09:45

标签: file parsing kotlin

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

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)的用法不是很优雅。

是否有更优雅或“更多科特林”的方式来获取这些信息?

2 个答案:

答案 0 :(得分:8)

使用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) }

答案 1 :(得分:1)

另一种方式:

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

或如Roland所愿:

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