求助!我每天会填写一个相同的模板,文件名是日期,例如2024.9.3,内容是一个表格,第一列是name,第二列col2(内容是开放的),第三列是col3(内容是开放的)。怎么样用dateview统计某个人在某一个时间段的col2和col3的内容?
比如:
name |
col2 |
col3 |
张三 |
内容A |
内容B |
李四 |
内容C |
内容D |
TABLE col2 AS "Col2内容", col3 AS "Col3内容"
FROM "统计"
WHERE name = "张三"
这个应该怎么实现呢
Probe
(Probe)
2
个人理解 dataview 没把 “md 表格” 作为默认的可解析对象,
即, 虽然笔记内的 列表 (任务条目), 文档属性, 标签, … 都可以拿 DQL 直接访问到,
但 md table 不行
所以还是得自己读文本内容, 把 table 解析出来再输出,
这事 dql 没戏, 还是写 dataviewjs 吧
可以参考 DataviewJS 的提取与汇总 - 经验分享 尤其可以借鉴 汇总原文 那一节, 比如搜 "汇总代码块、Callout"
那里
个人建议是把 table 转成 json, 比较能抗数据结构的变化, 例 (以下函数把文本形式的 table 解析为 [{name: xx, col1: yy, col2: zz}, {name: x2, col1: y2, col2: z2}, ...]
)
const parseTable = (content, noteFileName) => {
const lines = content.trim().split('\n');
// 查找表头行并确定列名
const headers = lines[0].slice(1, -1).split('|').map(cell => cell.trim());
// 查找数据行并提取信息,每一行为一个对象
let dataRows = lines.slice(2).map(row => {
const rowData = {};
const cells = row.slice(1, -1).split('|').map(cell => cell.trim());
headers.forEach((header, index) => {
rowData[header] = cells[index];
});
rowData['filename'] = noteFileName;
return rowData;
});
return dataRows;
};
如果确定表格结构不会改, 那也可以写简单点, 笔记里直接过滤以 |
起头的行, 对所有这种行, 切分后把固定位置的某几个元素取出, 就是所需数据
我大概明白你意思了,非常感谢!看来还是需要继续学习
liux
(calmwaves)
4
不好解析,一般是用正则,太不优雅了,也不稳定,如果写成这个样子就能好解析
name:: a
col2:: b
col3:: c
name:: e
col2:: d
col3:: f