如何从scala中的字符串中提取多个字符串部分?

How to extract multiple string part from string in scala?

我有一个字符串,我必须在其中获取一些字符串并将其存储在变量中。

data source=local/SQL,1433;initial catalog=Employee;user id=user_first;password=abc@123;encrypt=true;connectretrycount=3;connection timeout=30;

我需要提取 data sourceinitial catloguser idpassword 。并将其存储在变量中。 我试图将它转换成列表并迭代它并提取字符串。但我想那是不可行的。

我想将该值保存到像

这样的变量中

val 来源 = "local/SQL"

val catlog = "员工"

还有其他方法可以遵循吗?

“不可行”是什么意思?它工作得很好:

// s is the same string you provided
s.split(";").map { keyVal => 
  val Array(key, value, _*) = keyVal.split("=", 2)
  key -> value
} 

// result -> 
res2: Array[(String, String)] = Array(
  ("data source", "local/SQL,1433"),
  ("initial catalog", "Employee"),
  ("user id", "user_first"),
  ("password", "abc@123"),
  ("encrypt", "true"),
  ("connectretrycount", "3"),
  ("connection timeout", "30")
)

并轻松将其用作 udf。或者您可能更喜欢使用正则表达式:

val extractorPattern = "data source=([^;]*);initial catalog=([^;]*);.*".r
// expand this for other fields as well


val extractorPattern(dataSource, initialCatalog) = s
// The result in ammonite:
// dataSource: String = "local/SQL,1433"
// initialCatalog: String = "Employee"

还有一些其他的方法,你也可以把正则表达式用在spark API函数中。

更新


如果你想在函数内部以变量的形式访问它,你可以通过安全的方式进行:

val dataSource = res2.collectFirst { case ("data source", dataSource) => dataSource } 

// dataSource: Option[String] = Some(value = "local/SQL,1433")

或者,如果您确定原始字符串中始终存在数据源或基本上任何键,则:

val Some(dataSource) = res2.collectFirst { case ("data source", dataSource) => dataSource } 
// dataSource: String = "local/SQL,1433"