2016-08-23 244 views
0

我開始學習Scala並陷入了這個簡單的問題。我習慣使用Bash和Awk的Unix命令行來做到這一點,但我決定使用Scala進行學習。使用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") 

謝謝

回答

1

上getLines調用mkString(「\ n」),將導致整個文件的一個字符串,這是你一個人看到輸出第一行的原因。

下面的代碼段應該是工作:

if (args.length > 0) { 
    for (arg <- args) { 
     println(Source.fromFile(arg).getLines().filterNot(_.trim.startsWith("#")).map(_.split("\t")(2)).mkString("\n")) 
    } 
    } 
1

這裏是使用推導的溶液。下面的代碼將返回第二列。只需將硬編碼值1更改爲所需的列。

{for { 
     line <- Source.fromFile("test.txt").getLines 
     if(!(line contains "#")) 
    } 
    yield line.split("\t")(1) 
}.toList 
相關問題