textfile解析器:使用scala计算起始位置

textfile解析器:使用scala计算起始位置,scala,Scala,我是scala的初学者,我正在尝试实现以下算法。 我有以下意见: 11 DFI1-MONT_TT_13 9(18) 14 IntegerType 11 SERI1-SENS_13 X(01) 06 StringType 11 DDRI1-MONT_TT_14 9(18) 12 IntegerType 11 SQRI1-SENS_14 X(01) 14 StringType 11 XCRI1-MONT_TT_15 9(18) 10 IntegerType 11 QSRI1-SENS_15 X(01

我是scala的初学者,我正在尝试实现以下算法。 我有以下意见:

11 DFI1-MONT_TT_13 9(18) 14 IntegerType
11 SERI1-SENS_13 X(01) 06 StringType
11 DDRI1-MONT_TT_14 9(18) 12 IntegerType
11 SQRI1-SENS_14 X(01) 14 StringType
11 XCRI1-MONT_TT_15 9(18) 10 IntegerType
11 QSRI1-SENS_15 X(01) 08 StringType
11 WQRI1-DEVISE X(03) 07 StringType
我想计算每个字段的起始位置,所以我的输出应该如下所示:

11 DFI1-MONT_TT_13 9(18)  0  14 IntegerType
11 SERI1-SENS_13 X(01) 14  06 StringType
11 DDRI1-MONT_TT_14 9(18) 20  12 IntegerType
11 SQRI1-SENS_14 X(01) 32  14 StringType
11 XCRI1-MONT_TT_15 9(18)  46 10 IntegerType
11 QSRI1-SENS_15 X(01) 56  08 StringType
11 WQRI1-DEVISE X(03) 64 07 StringType
起始位置可按如下方式计算:

startposition_line_n= startposition_line_n-1 + length_line_n-1
我们假设第一行的起始位置等于0


我已经知道我可以使用
scanleet
foldLeft
,但是我现在不知道如何递归地使用它。我在input中从数据集中获取了一个样本,目前它包含了更多的行。

类似这样的内容,如果需要澄清,请删除注释

val input = List(
    "10 DFI1-MONT_TT_13 9(18) 14 IntegerType",
    "10 SERI1-SENS_13 X(01) 06 StringType",
    "10 DDRI1-MONT_TT_14 9(18) 12 IntegerType",
    "10 SQRI1-SENS_14 X(01) 14 StringType",
    "10 XCRI1-MONT_TT_15 9(18) 10 IntegerType",
    "10 QSRI1-SENS_15 X(01) 08 StringType",
    "10 WQRI1-DEVISE X(03) 07 StringType")
)

input.foldLeft((0, List[String]())) {
    case ((sum, acc), line) => {
        val sp = line.split(" ")
        val si = 3
        (sum + sp(si).toInt, acc :+ ((sp.take(si) :+ sum) ++ sp.takeRight(sp.size - si)).mkString(" "))
    }
}._2

下面是一个尾部递归方法,它将
List[String]
作为输入,并生成一个新的、经过修改的
List[String]
作为输出

def setPos(input :List[String]
          ,pos   :Int=0
          ,acc   :List[String]=List()
          ) :List[String] =
  if (input.isEmpty) acc.reverse
  else {
    val line = input.head.split("\\s+")
    setPos(input.tail
          ,pos + line(3).toInt
          ,line.patch(3, Seq(pos.toString), 0).mkString(" ") :: acc)
  }

这假定第三个空格分隔的字段始终是偏移量整数。如果不是这样,它将抛出一个错误。

我的输入是一个字符串列表,你知道如何将其转换为itertaot[string]以便我可以轻松使用此算法,我目前遇到以下错误:cala:117:错误:类型不匹配;找到:需要列表[String]:迭代器[String]@ben;代码已调整。在寻求帮助时要具体。