首先道歉,作为 Scala 的初学者,我找不到更好的措辞来回答这个问题。
我有一个属性文件,需要在其中定义一些参数化命令(或 sql 查询)。以下是一个示例:
[section abc]
stage: StageA
query: Select count(*) FROM tableA WHERE account_id=${account_id} AND dt=$dt AND source=$source
[section def]
stage: StageB
query: Select count(*) FROM tableB WHERE event_date=${event_date} AND template=$template
在我的代码中,我有一个配置对象(考虑一个映射),它具有查询字符串中变量的值(account_id
, source
, dt
, event_date
, template
, ETC。,)。阅读属性文件后,我需要替换查询字符串中的所有宏。为此,我想编写一个具有如下签名的函数:
def resolve_query(query: String, config: Map[String, Any]): String
它应该返回查询文本,其中宏替换为配置中的值。我尝试编写自己的字符串插值器,但它不起作用。还有什么我可以尝试的吗?
通过字符串插值,编译器将String
在将它们发送到重新组合之前将其文字化StringContext
。编译器不会对变量中的字符串值执行此操作,因此您必须自己进行切割。
def resolve_query(query: String, config: Map[String, Any]): String =
"(.*)\\$\\{([^}]+)}(.*)".r
.findFirstMatchIn(query)
.fold(query){ m =>
resolve_query(StringContext(m.group(1)
,m.group(3)
).s(config.getOrElse(m.group(2), "unknown")
)
,config
)
}
testing:
resolve_query(
"Select count(*) FROM tableA WHERE account_id=${account_id} AND source=${source}"
,Map("account_id" -> 47, "source" -> "UK")
)
//res0: String = Select count(*) FROM tableA WHERE account_id=47 AND source=UK
你会注意到我只实现了更简单的${braces}
定界形式。这$dollar
分隔形式并不复杂,但允许两者(任一/或)将比我现在愿意投入的工作更多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)