regex - 在每组格式化字符串中查找最大 wrt 子字符串
问题描述
我正在努力寻找一个场景的解决方案。我的目录中的文件很少。让我们说
vbBaselIIIData_201802_3_d.data.20180405.txt.gz
vbBaselIIIData_201802_4_d.data.20180405.txt.gz
vbBaselIIIData_201803_4_d.data.20180405.txt.gz
vbBaselIIIData_201803_5_d.data.20180405.txt.gz
这里假设第二个下划线之后的单个数字称为runnumber。我必须只选择具有最新运行号的文件。所以在这种情况下,我只需要从四个文件中选择两个并将其放入一个可变的 scala 列表中。ListBuffer 应包含:
vbBaselIIIData_201802_4_d.data.20180405.txt.gz
vbBaselIIIData_201803_5_d.data.20180405.txt.gz
任何人都可以建议我如何实现这一点。我正在使用 Scala,但也只赞赏算法。我们可以使用哪些正确的数据结构集?我们需要实现哪些功能?有什么建议么。
解决方案
这是一个希望有点鼓舞人心的提议,它展示了一大堆不同的语言特性和集合上的有用方法:
val list = List(
"vbBaselIIIData_201802_3_d.data.20180405.txt.gz",
"vbBaselIIIData_201802_4_d.data.20180405.txt.gz",
"vbBaselIIIData_201803_4_d.data.20180405.txt.gz",
"vbBaselIIIData_201803_5_d.data.20180405.txt.gz"
)
val P = """[^_]+_(\d+)_(\d+)_.*""".r
val latest = list
.map { str => {val P(id, run) = str; (str, id, run.toInt) }}
.groupBy(_._2) // group by id
.mapValues(_.maxBy(_._3)._1) // find the last run for each id
.values // throw away the id
.toList
.sorted // restore ordering, mostly for cosmetic purposes
latest foreach println
简要说明您在阅读 Scala 简介时可能遗漏的并非完全无关紧要的部分:
"regex pattern".r
将字符串转换为已编译的正则表达式模式- 块
{ stmt1 ; stmt2 ; stmt3 ; ... ; stmtN; result }
计算为最后一个表达式result
- 提取器语法可用于编译的正则表达式模式
val P(id, run) = str
匹配第二个和第三个_
分隔值_.maxBy(_._3)._1
str
找到具有最高运行次数的三元组,然后再次提取第一个组件
输出:
vbBaselIIIData_201802_4_d.data.20180405.txt.gz
vbBaselIIIData_201803_5_d.data.20180405.txt.gz
推荐阅读
- javascript - 如何获取 Visualizer 的音轨
- javascript - 比较 2 个数组并更改属性值
- php - php截断大数据
- cassandra - s390x 架构上的 Cassandra
- python - DeepRL:了解 DQN 的批量损失值
- node.js - 如何为 Google Cloud Storage 设置 Nodejs 环境
- google-maps - Google Maps JS 冻结 Internet Explorer 11
- java - 如何在 Hibernate - Criteria Queries 中获得大于记录?
- bash - 如何在powershell函数中制作输入参数并将其写入文件?
- node.js - 您如何限制跨文件的 API 请求?[节点]