You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

注意事项

  1. 用jq内置的INDEX函数将categories.json中的分类数组按id构建为键值对索引,查找效率远高于手动遍历
  2. 如果你的categories.json中id是数字类型,交易数据里的category_id也是数字类型,把上述代码中的tostring删掉即可
  3. 末尾的// "未知分类"是兜底逻辑,匹配不到的分类会显示为未知分类,避免报错
  4. 如果你已经确认所有字段都存在,可以去掉兜底逻辑,直接输出的文件名即可直接用于批量重命名

内容的提问来源于stack exchange,提问作者ged

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:36:00