我开始学习Scala并深入研究这个简单的问题。我习惯使用Unix命令行与Bash和Awk这样做,但我决定使用Scala进行学习。
我想解析多个文本文件,这些文件是制表符分隔的,想要提取1或任意列。
我还想删除以"#"开头的行。我能做到的。
下面的代码将打印每个文件中特定列的第一行。 如何让它打印所有行?
import scala.io.Source
if (args.length > 0){
for (arg<-args){
val file= Source.fromFile(arg).getLines.filter(s => !(s contains "#")).mkString("\n").split("\t")
println(file(2))
}
}
else
Console.err.println("Please enter filename")
谢谢
答案 0 :(得分:1)
在getLines上调用mkString(&#34; \ n&#34;)将导致整个文件的单个字符串,这就是您仅看到第一行输出的原因。
以下代码段应该正常工作:
if (args.length > 0) {
for (arg <- args) {
println(Source.fromFile(arg).getLines().filterNot(_.trim.startsWith("#")).map(_.split("\t")(2)).mkString("\n"))
}
}
答案 1 :(得分:1)
这是一个用于理解的解决方案。以下代码将返回第二列。只需将硬编码值1更改为您想要的任何列。
{for {
line <- Source.fromFile("test.txt").getLines
if(!(line contains "#"))
}
yield line.split("\t")(1)
}.toList