如何从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 source
、 initial catlog
、user id
和 password
。并将其存储在变量中。
我试图将它转换成列表并迭代它并提取字符串。但我想那是不可行的。
我想将该值保存到像
这样的变量中
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"
我有一个字符串,我必须在其中获取一些字符串并将其存储在变量中。
data source=local/SQL,1433;initial catalog=Employee;user id=user_first;password=abc@123;encrypt=true;connectretrycount=3;connection timeout=30;
我需要提取 data source
、 initial catlog
、user id
和 password
。并将其存储在变量中。
我试图将它转换成列表并迭代它并提取字符串。但我想那是不可行的。
我想将该值保存到像
这样的变量中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"