我从csv文件循环以下行来解析它们.我想识别自标题以来的第一行.什么是最好的方法,而不是制作var计数器持有人.
var counter = 0
for (line <- lines) {
println(CsvParser.parse(line, counter))
counter++
}
Run Code Online (Sandbox Code Playgroud)
我知道有一个更好的方法来做这件事,Scala的新手.
Tom*_*icz 23
试试zipWithIndex
:
for (line <- lines.zipWithIndex) {
println(CsvParser.parse(line._1, line._2))
}
Run Code Online (Sandbox Code Playgroud)
@tenshi建议使用模式匹配进行以下改进:
for ((line, count) <- lines.zipWithIndex) {
println(CsvParser.parse(line, count))
}
Run Code Online (Sandbox Code Playgroud)
我完全同意给定的答案,我仍然要指出一些重要的事情,最初我打算做一个简单的评论.
但它会很长,所以,让我把它设置为一个变体答案.
总的来说,zip*
方法对于创建带有列表的表是有帮助的,但是它们具有循环列表以便创建它的对应物.
因此,一个共同的建议是对列表中所需的操作进行排序view
,以便将所有这些操作组合起来,只需要生成结果.当可退货不是时,会考虑生成结果Iterable
.foreach
例如,也就是这样.
现在,谈论第一个答案,如果你必须lines
是一个非常大的文件中的行列表(甚至是它上面的枚举),zipWithIndex
将遍历所有的'em并生成一个表(Iterable of tuples).然后,for-comprehension将再次返回相同数量的项目.
最后,你已经影响了运行的长度n
,在哪里n
是长度lines
并且增加了m + n*16
(roughtly)内存占用m
的lines
"足迹".
lines.view.zipWithIndex map Function.tupled(CsvParser.parse) foreach println
Run Code Online (Sandbox Code Playgroud)
剩下的几句话(我保证),lines.view
会创建类似的东西scala.collection.SeqView
将保持所有进一步的"映射"功能产生新的Iterable,as zipWithIndex
和map
.
此外,我认为表达更优雅,因为它遵循读者和逻辑."对于行,创建一个视图,将每个项目的索引压缩,结果将映射到必须打印的解析器的结果".
HTH.