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

时间:2018-04-22 21:47:32

标签: 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) 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

我已经知道我可以使用scanLeftfoldLeft但是我正在开始我现在不会如何递归地执行此操作。我从输入中的数据集中获取了一个样本,目前它包含更多的行。

2 个答案:

答案 0 :(得分:0)

如果您需要一些说明,请删除评论。

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

答案 1 :(得分:0)

这是一个尾递归方法,它以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)
  }

这假设第3个以空格分隔的字段始终是偏移整数。如果情况并非如此,则会抛出错误。