如何使用jq实现两步查找处理银行交易数据生成收据文件名
问题背景
我所使用的银行交易导出功能体验极差,大幅提升了税务收据对账的难度。好在该银行官网是SPA应用,接口返回了大量结构完整的JSON格式数据。我已经提取了全年的交易数据,希望将其转换为date - cat - desc - amt.pdf格式的文件名,用于收据扫描件命名以加快对账流程。目前大部分逻辑已经完成,仅两步查找的实现卡壳,希望熟悉jq的开发者提供帮助。
交易数据示例
以下为截取的部分示例数据(出于隐私考虑省略了大量字段):
export START_YEAR=2020 cat ${START_YEAR}-transaction.json | jq -c -r \ '{ transaction_date: .transaction_date | capture("(?<x>[0-9,-]{10})") | join("-"), id: .id, category_id: .category_id, description: .description }' \ | tail -4
输出的交易数据结构如下:
{"transaction_date":"2020-01-01","id":365707178,"category_id":113,"description":"PAYPAL *JOES DC"} {"transaction_date":"2020-01-02","id":366592530,"category_id":84,"description":"SANSOTEI RAMEN"} // 剩余示例数据省略展示
查找逻辑需求
- 第一步:用交易数据中的
category_id,在categories.json数据集里查询对应的category.key字段作为翻译标签,比如category_id为113对应标签为electronicsComputers。categories.json是从Angular应用文件app.dc68cc71460569631f28.js中提取的。 - 第二步:将第一步得到的翻译标签,在
en_CA.json(站点使用法语时对应fr_CA.json)的global.transactionsCategories字段中查询,得到对应的自然语言分类描述,比如electronicsComputers对应结果为Electronics & Computers。
我自己编写的jq命令运行时报语法错误,推测是语法使用有误,且没有正确实现两次查找的逻辑:
jq --argfile cat_lookup categories.json --argfile cat_word en_CA.json \ 'if $cat_lookup.transactionsCategories.id == .category_id then .cat_desc = $cat_word[$cat_lookup.key] end' \ ${START_YEAR}-transaction.json | head
实现方案
我们提前把两个查找表构建为索引字典,避免每次遍历查找,性能更好且逻辑更清晰。
完整运行命令
jq --argfile cat_lookup categories.json --argfile i18n en_CA.json ' # 第一步:构建分类ID到翻译标签的索引字典 INDEX($cat_lookup.transactionsCategories[]; .id) as $id_to_key # 第二步:取出i18n里的分类翻译字典 | $i18n.global.transactionsCategories as $key_to_label # 遍历每一条交易数据,做两次查找 | . + { category_label: $key_to_label[$id_to_key[.category_id|tostring].key] // "未知分类" } # 如果要直接输出最终的文件名格式,取消注释下面这行 # | "\(.transaction_date) - \(.category_label) - \(.description) - \(.amount).pdf" ' ${START_YEAR}-transaction.json
注意事项
- 用jq内置的
INDEX函数将categories.json中的分类数组按id构建为键值对索引,查找效率远高于手动遍历 - 如果你的categories.json中id是数字类型,交易数据里的category_id也是数字类型,把上述代码中的
tostring删掉即可 - 末尾的
// "未知分类"是兜底逻辑,匹配不到的分类会显示为未知分类,避免报错 - 如果你已经确认所有字段都存在,可以去掉兜底逻辑,直接输出的文件名即可直接用于批量重命名
内容的提问来源于stack exchange,提问作者ged
相关产品推荐
相关产品推荐

