Yvan
(Yvan)
1
因工作需要经常需要统计数据,每天的内容几乎一样,想请教一下能否用 Dataview 实现从多个文件中定位某一段文字提取相应数字并列表显示的功能。
大概如下:
多个文件中都有重复的一段话如下:
今天门店共销售35000元,男装50件,女装60件,其他120件,计划完成率85%,效益较好。
预期的效果
通过Dateview自动读取关键字,列出表格如下:
日期 | 销售额 | 男装 | 女装 | 完成率 | 效益
0206 | 25000 | 40 | 60 | 70% | 不佳
0207 | 35000 | 50 | 80 | 85% | 好
类似上述表格的形式, 虽然是固定字段,但是没有设置标签,这是不是有点为难Dataview了? 特请教,用代码如何实现,感谢大佬!
奔跑的蜗牛
(奔跑的蜗牛)
2
可以写,dataview主要用来获取内容及渲染表格,具体数据使用正则匹配就行。
当然前提是内容真的很重复及有规律,比如“共销售35000元”可以匹配销售和元之间的数字,这么来写正则表达式。
Yvan
(Yvan)
3
感谢答复,编程小白不会写,能否给段演示代码,我自己去调试。 
奔跑的蜗牛
(奔跑的蜗牛)
4
const pages = dv.pages('"数据来源"')
let list = []
for (const page of pages) {
const file = app.vault.getAbstractFileByPath(page.file.path)
const str = await app.vault.read(file)
const reg = /销售(\d+)元,男装(\d+)件,女装(\d+)件,其他(\d+)件,计划完成率(\d+)%,效益(.{2})/
const result = str.match(reg)
if (result) {
const data = {
date: page.file.name,
sales: result[1],
man: result[2],
women: result[3],
other: result[4],
rate: result[5],
effect: result[6]
}
list.push(data)
}
}
dv.table(
["日期","销售额","男装","女装","其他","完成率","效益"],
list.map((item, index) => {
return [
item.date,
item.sales,
item.man,
item.women,
item.other,
item.rate,
item.effect]
})
)
测试文件结构为: “数据来源/0206”,内容仅有示例中的一句话。
效果如下
1 个赞
Yvan
(Yvan)
6
测试代码通过,还有两个小问题:
1、原文中但凡数字前后有空格 就无法提取该数字,必须汉字和数字间没有空格才行,但实际录入时,经常会自动增加空格,这个如何解决?
2、另外如何限制输出条数,比如只列表近5天的。
谢谢大佬!
因为匹配模式为“文字(\d+)文字” \d+
表示匹配多个数字,无空格。如果想灵活使用可以简单了解一下正则表达式,对上面的例子微调即可。([\s\S]+)
,简单点直接把空格也收录 