我是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的单独变量中。
谢谢, 巴布
答案 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)
正则表达式将为每个一组创建三个组,我们将结果分别存储到scanVal
,startTimeVal
,endTimeVal
中。
输出:
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: "))