1

我正在尝试从 scala 中的本地读取文件,如下所示。

val inpFile = "/Users/Abcde/Downloads/data.txt"
def loadFromLocal:Unit = {
    val lines = Source.fromFile(inpFile).getLines.toList
    println("Lines: " + lines.size)
}

文件内的数据如下所示:

#HRec300 1940 10 18 99 2200    7          bnk-dep
31 -9999  -9999    40 -9999 -9999 -9999    23    20 
30 -9999  -9999   500 -9999 -9999 -9999    90    20 
30 -9999  -9999   750 -9999 -9999 -9999   113    20 
30 -9999  -9999  1000 -9999 -9999 -9999   113    20 
30 -9999  -9999  1500 -9999 -9999 -9999   203    10 
30 -9999  -9999  2000 -9999 -9999 -9999    90    20 
30 -9999  -9999  2500 -9999 -9999 -9999    90    30 
#HRec300 1940 10 19 99 1000    6          bnk-dep  
31 -9999  -9999    40 -9999 -9999 -9999     0    30 
30 -9999  -9999   500 -9999 -9999 -9999     0    80 
30 -9999  -9999   750 -9999 -9999 -9999   338    90 
30 -9999  -9999  1000 -9999 -9999 -9999   338    60 
30 -9999  -9999  1500 -9999 -9999 -9999   338    40 
30 -9999  -9999  2000 -9999 -9999 -9999   338    40 
#HRec300 1940 10 19 99 2200    6          bnk-dep  
31 -9999  -9999    40 -9999 -9999 -9999   338    70 
30 -9999  -9999   500 -9999 -9999 -9999   338    90 
30 -9999  -9999   750 -9999 -9999 -9999     0   100 
30 -9999  -9999  1000 -9999 -9999 -9999   338   110 
30 -9999  -9999  1500 -9999 -9999 -9999   338   110 
30 -9999  -9999  2000 -9999 -9999 -9999   338    80 

杂项数据由标头分隔,即对于每个标头,有多个杂项数据,每个标头记录以第一个字符“#”开头我需要为每个块获取标头记录并将其相应的标头添加到杂项-数据如下。

#HRec300 1940 10 18 99 2200    7          bnk-dep
31 -9999  -9999    40 -9999 -9999 -9999    23    20 HRec300
30 -9999  -9999   500 -9999 -9999 -9999    90    20 HRec300
30 -9999  -9999   750 -9999 -9999 -9999   113    20 HRec300
30 -9999  -9999  1000 -9999 -9999 -9999   113    20 HRec300
30 -9999  -9999  1500 -9999 -9999 -9999   203    10 HRec300
30 -9999  -9999  2000 -9999 -9999 -9999    90    20 HRec300
30 -9999  -9999  2500 -9999 -9999 -9999    90    30 HRec300
#HRec301 1940 10 19 99 1000    6          bnk-dep  
31 -9999  -9999    40 -9999 -9999 -9999     0    30 HRec301
30 -9999  -9999   500 -9999 -9999 -9999     0    80 HRec301
30 -9999  -9999   750 -9999 -9999 -9999   338    90 HRec301
30 -9999  -9999  1000 -9999 -9999 -9999   338    60 HRec301
30 -9999  -9999  1500 -9999 -9999 -9999   338    40 HRec301
30 -9999  -9999  2000 -9999 -9999 -9999   338    40 HRec301
#HRec302 1940 10 19 99 2200    6          bnk-dep  
31 -9999  -9999    40 -9999 -9999 -9999   338    70 HRec302
30 -9999  -9999   500 -9999 -9999 -9999   338    90 HRec302
30 -9999  -9999   750 -9999 -9999 -9999     0   100 HRec302
30 -9999  -9999  1000 -9999 -9999 -9999   338   110 HRec302
30 -9999  -9999  1500 -9999 -9999 -9999   338   110 HRec302
30 -9999  -9999  2000 -9999 -9999 -9999   338    80 HRec302

谁能让我知道如何在文件中的两个标题记录之间获取数据块?

4

1 回答 1

2

您可以使用创建记录的递归函数

这里是最简单的版本:

  case class Record(title: String, lines: List[String] = Nil)

  @tailrec
  def createRecords(lines: List[String], records: List[Record]): List[Record] =
    lines match {
      case Nil => records // no work to do anymore
      case x::xs if x.startsWith("#") => createRecords(xs, Record(x)::records) // a new Record
      case x::xs =>
        val rec = records.head
        createRecords(xs, rec.copy(lines = x::rec.lines)::records.tail) // include line to existing Record
    }

用法:createRecords(lines, Nil),检查scalafiddle

  • lines来自您的示例 ( val lines = Source.fromFile(inpFile).getLines.toList)
  • records累积解决方案(因此它是尾递归并且不会炸毁堆栈)

意识到:

  • 没有异常处理(如果数据不是很好)

  • 记录的顺序及其行是相反的。

于 2019-09-13T09:16:54.210 回答