如何从Scala中的字符串变量中提取特定文本

时间:2019-05-08 02:23:49

标签: scala

我是Spark scala世界的新手,正在尝试学习它。我有一个包含以下值的变量。

val result = "Scan value: 1802 seconds
Start time: Thu, Jan 31 2019, 15:09:09 GMT
End time: Thu, Jan 31 2019, 15:39:11 GMT"

我想读取1802秒的扫描值,并将开始时间和结束时间读取到不同的变量。

我正在尝试使用子字符串,但无法正确获取结果,并且位置可能与用户输入的方式非常相似。

例如:要读取扫描值,我正在做以下事情。但是有时这些位置可能会根据用户进入系统的方式而改变。

val scan_value = result.sbstring(13,4)

任何人都可以帮助我如何将这些值读入scala的单独变量中。

谢谢, 巴布

3 个答案:

答案 0 :(得分:2)

假设输入将始终采用指定的格式,则以下代码将帮助您提取startTime和end time为其各自的变量

val result = """ Scan value: 1802 seconds
Start time: Thu, Jan 31 2019, 15:09:09 GMT
  End time: Thu, Jan 31 2019, 15:39:11 GMT"""

val mayBeScanTime = result.split("Scan value:").find(_.contains("seconds")).map(_.split("seconds")(0).trim)


val startTime = Option(result.split("Start time:")(1).split("End time:")(0).trim)


val endTime = Option(result.split("End time:")(1).trim)

这将为您提供

mayBeScanTime: Option[String] = Some(1802)


startTime: Option[String] = Some(Thu, Jan 31 2019, 15:09:09 GMT)


endTime: Option[String] = Some(Thu, Jan 31 2019, 15:39:11 GMT)

请注意,如果输入字符串更改,则以下代码将无法产生正确的结果。

答案 1 :(得分:0)

这是利用Scala的正则表达式功能并将结果提取到Map中的另一种方法:

import scala.util.matching.Regex

val data = """Scan value: 1802 seconds
Start time: Thu, Jan 31 2019, 15:09:09 GMT
End time: Thu, Jan 31 2019, 15:39:11 GMT"""

val regex = raw"Scan value:\s(.*)\sseconds\sStart time:\s(.*)\sEnd time:\s(.*)".r
val result = data match {
  case regex(scanVal, startTimeVal, endTimeVal) => Map("scan" -> scanVal, 
                                                     "startTime" -> startTimeVal,
                                                      "endTime" -> endTimeVal)
}

print(result)

正则表达式将为每个一组创建三个组,我们将结果分别存储到scanValstartTimeValendTimeVal中。

输出:

Map(scan -> 1802, startTime -> Thu, Jan 31 2019, 15:09:09 GMT, endTime -> Thu, Jan 31 2019, 15:39:11 GMT)

答案 2 :(得分:0)

如果不同的值总是用换行符分隔,则也可以尝试以下操作。

val result = """Scan value: 1802 seconds
Start time: Thu, Jan 31 2019, 15:09:09 GMT
End time: Thu, Jan 31 2019, 15:39:11 GMT"""

val resultArray = result.split('\n')
val scanValue = resultArray.find(_.startsWith("Sc")).map(_.stripPrefix("Scan value: ").stripSuffix(" seconds"))
val startTime = resultArray.find(_.startsWith("St")).map(_.stripPrefix("Start time: "))
val endTime = resultArray.find(_.startsWith("E")).map(_.stripPrefix("End time: "))