我有一个文本文件,其中包含遵循替代模式的行,例如:
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 ”的方式来获取这些信息?
最佳答案
使用 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) }