docs: 补充 mapping 的 metadata 推荐英文 key 候选清单 CONFIGURATION.md 新增 6.0 Mapping 配置推荐写法一节,说明应将供应商账单全部字段一一映射进 extra_fields,从而在生成的 beancount 账单 metadata 中保留账单全部字段 大幅扩充 extra_fields 的 metadata 推荐英文 key 候选,覆盖交易日期/时间、记账日/委托日、创建/成功时间、商品说明、交易类型、交易单号、支付方式、交易状态、交易对象、对方账号/开户行、商家及商家订单号、金额及收入/支出/订单/实付金额、货币、余额、参考、交易来源/分类/地点/国家、市场、账户、证券代码/名称/成交价格/数量/成交金额/手续费/税费、持仓、协议编号、股东代码、产品账号、备注等各类字段 修正示例中误用的全角逗号为半角逗号,并将 extra_fields 由列表写法改为 YAML 内联 mapping 写法 补充说明 metadata key 输出前会自动归一化(常见别名收敛到 txType/method/orderId/merchantId/peer/note 等规范键,snake_case 转 lowerCamelCase),推荐键尽量贴近规范键以避免配置与输出不一致 CONTRIBUTING.md 在 mapping 与 provider 模板处补充说明:extra_fields 字段映射与 rules 应交由用户侧自行配置,避免开发者上游预置造成英文 key 习惯冲突并削弱用户自定义能力 src/providers/shared/securities/trade/mod.rs 移除未使用的 price::Price 导入
docs: 补充 mapping 的 metadata 推荐英文 key 候选清单
把银行账单、第三方支付、券商交易记录转成 Beancount 复式分录的 CLI 工具。
第三方支付 alipay wechat jd mt 银行 icbc ccb dzccb 证券 yinhe futu
从 Releases 下载对应平台的二进制,解压即用(内含 config/ 与 mapping/ 配置模板)。
config/
mapping/
./beancount-importer-rust --help
从源码编译:
cargo build --release
Step 1 — 导出账单(支付宝 → 我的 → 账单 → 开具交易流水证明)。
Step 2 — 一条命令:
./beancount-importer-rust \ -p alipay \ -s ~/Downloads/alipay_2026.csv \ -c config/third_party/alipay.yml \ -o alipay.bean --log-level info
输出类似:
2026-06-15 * "星巴克" "Coffee" source: "支付宝" orderId: "20260615..." Expenses:Food:Coffee 32.50 CNY Assets:Wallet:Alipay:Balance -32.50 CNY
Step 3 — 用规则自动分类。在 config/third_party/alipay.yml 加:
config/third_party/alipay.yml
rules: - name: "餐饮" conditions: - fields: [peer, item] regex: "星巴克|麦当劳|外卖" action: debit_account: "Expenses:Food"
rules: - name: "餐饮" conditions: - field: "peer" equals: "星巴克" # 精确匹配 action: debit_account: "Expenses:Food" - name: "外卖" conditions: - field: "peer" contains: "美团" # 子串匹配 action: debit_account: "Expenses:Food:Delivery" - name: "交通" conditions: - field: "peer" regex: "滴滴|铁路|地铁|航空" # 正则 action: debit_account: "Expenses:Transport"
fields
- name: "餐饮" conditions: - fields: [peer, item] # peer 或 item 任意命中即匹配 regex: "小吃|零食|火锅|串串|餐饮|中餐|奶茶|咖啡|外卖" action: debit_account: "Expenses:Food"
一条条件覆盖两个字段,不用每个字段写一遍。
- name: "小额杂项" conditions: - field: "amount" less_than: 50 action: debit_account: "Expenses:Misc" ignore: true # 忽略小额交易,不导出
equals: "支出"
contains: "交通"
regex: "咖啡|奶茶"
{1}
{2}
starts_with: "银行卡"
ends_with: "-TEST"
in: ["A", "B", "C"]
not_empty:
is_empty:
greater_than: 100
less_than: 100
between: { min: 50, max: 200 }
多条规则命中同一笔交易时:
debit/credit_account
narration
payee
flag
tags
links
metadata
ignore
terminal
默认执行顺序:priority 小 → 大 → 条件数 少 → 多 → 文件顺序。
priority 小 → 大
条件数 少 → 多
文件顺序
不要为”账号 × 品类”写 N×M 条规则。拆两层:
rules: # Layer 1 — priority 100:识别支付方式 → 确定贷方账户 - name: "支付宝" priority: 100 conditions: - field: "source" equals: "支付宝" action: credit_account: "Assets:Wallet:Alipay:Balance" - name: "微信" priority: 100 conditions: - field: "source" equals: "微信" action: credit_account: "Assets:Wallet:WeChat:Balance" # Layer 2 — priority 10:识别消费类别 → 确定借方账户 - name: "餐饮" priority: 10 conditions: - fields: [peer, item] regex: "小吃|零食|火锅|中餐|奶茶|外卖" action: debit_account: "Expenses:Food"
两层自动合并:支付宝买外卖 → debit=Expenses:Food, credit=Assets:Wallet:Alipay:Balance。N + M 条替代 N×M 条。
每个供应商需要两个文件(Release 包已内置,修改即可)。
# mapping/third_party/alipay.yml date: "交易时间" payee: "交易对方" narration: "商品说明" transaction_type: "收/支" amount: column: "金额" transform: abs # abs: 取绝对值 negate: 取反 reference: "交易订单号" date_formats: # 按顺序尝试 - "%Y/%m/%d %H:%M" - "%Y-%m-%d %H:%M:%S"
# config/third_party/alipay.yml name: "支付宝" default: asset_account: "Assets:Wallet:Alipay:Balance" expense_account: "Expenses:Unknown" income_account: "Income:Unknown" currency: "CNY" tabular_options: delimiter: "," flexible: true encoding: "auto" skip_header_lines: 24 # 跳过支付宝的 24 行说明 has_header_row: true rules: []
银行类注意 tabular_options 可能需要 income_column / expense_column(出入账分两列),证券类需要 securities_accounts。完整字段见 **CONFIGURATION.md**。
tabular_options
income_column
expense_column
securities_accounts
# config/global.yml default: currency: CNY expense_account: Expenses:Unknown asset_account: Assets:Unknown income_account: Income:Unknown output: date_format: "%Y-%m-%d" decimal_places: 2
配置写好后每月只需要一条命令:
# batch-2026-06.yml imports: - provider: icbc source: ~/Downloads/icbc-202606.csv config: config/banks/icbc.yml output: 2026/06/icbc.bean - provider: alipay source: ~/Downloads/alipay-202606.csv config: config/third_party/alipay.yml output: 2026/06/alipay.bean - provider: yinhe source: ~/Downloads/yinhe-202606.xls config: config/securities/yinhe.yml output: 2026/06/galaxy.bean
./beancount-importer-rust --batch batch-2026-06.yml
所有相对路径基于 batch 文件所在目录解析。
yinhe
自动识别:
银行转证券
证券转银行
204001
131810
回购
repo_interest_account
./beancount-importer-rust -p yinhe \ -s ~/Downloads/yinhe-202606.xls \ -c config/securities/yinhe.yml \ -o galaxy.bean --log-level info
输出示例:
2026-06-15 * "银证转账" "银行转证券" source: "银河证券" Assets:Broker:Galaxy:Cash 10000.00 CNY Assets:Bank:ICBC:Savings -10000.00 CNY 2026-06-16 * "买入" "沪深300ETF" source: "银河证券" symbol: "510300" Assets:Broker:Galaxy:Securities 1000 HOOD {4.567 CNY} Assets:Broker:Galaxy:Cash -4567.00 CNY Expenses:Broker:Galaxy:Fee 5.00 CNY Expenses:Broker:Galaxy:Rounding 0.01 CNY
futu
USD 计价,自动输出 commodity USD 指令。
commodity USD
-p, --provider
alipay|wechat|icbc|yinhe|...
-s, --source
-c, --config
-g, --global-config
config/global.yml
-m, --mapping
-o, --output
--log-level
error|warn|info|debug|trace
--strict
-b, --batch
--log-level info # 看到每条记录的分类结果 --log-level debug # 看到规则匹配详情 --log-level trace # 看到完整内部状态 --strict # 任何一条记录解析失败就报错退出
# 只测试不写文件(不传 -o 输出到终端) ./beancount-importer-rust -p alipay -s bill.csv -c config/third_party/alipay.yml # 验证输出 bean-check alipay.bean grep "Expenses:Food" alipay.bean | wc -l
MIT
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
beancount-importer-rust
把银行账单、第三方支付、券商交易记录转成 Beancount 复式分录的 CLI 工具。
支持的供应商
安装
从 Releases 下载对应平台的二进制,解压即用(内含
config/与mapping/配置模板)。从源码编译:
5 分钟上手
Step 1 — 导出账单(支付宝 → 我的 → 账单 → 开具交易流水证明)。
Step 2 — 一条命令:
输出类似:
Step 3 — 用规则自动分类。在
config/third_party/alipay.yml加:规则引擎
基本写法
多字段 OR 匹配(推荐
fields数组)一条条件覆盖两个字段,不用每个字段写一遍。
金额范围
全部运算符
equals: "支出"contains: "交通"regex: "咖啡|奶茶"{1}{2}starts_with: "银行卡"ends_with: "-TEST"in: ["A", "B", "C"]not_empty:is_empty:greater_than: 100less_than: 100between: { min: 50, max: 200 }规则合并与优先级
多条规则命中同一笔交易时:
debit/credit_account、narration、payee、flagtags、linksmetadataignoreterminal默认执行顺序:
priority 小 → 大→条件数 少 → 多→文件顺序。分层规则(推荐策略)
不要为”账号 × 品类”写 N×M 条规则。拆两层:
两层自动合并:支付宝买外卖 → debit=Expenses:Food, credit=Assets:Wallet:Alipay:Balance。N + M 条替代 N×M 条。
配置概览
每个供应商需要两个文件(Release 包已内置,修改即可)。
1. 字段映射(mapping)— 告诉工具 CSV 哪列是什么
2. Provider 配置 — 告诉工具怎么读 + 怎么分类
银行类注意
tabular_options可能需要income_column/expense_column(出入账分两列),证券类需要securities_accounts。完整字段见 **CONFIGURATION.md**。3. 全局配置 — 所有供应商的公共默认值(通常不用改)
每月一键导入(批量模式)
配置写好后每月只需要一条命令:
所有相对路径基于 batch 文件所在目录解析。
证券专项
银河证券(
yinhe)自动识别:
银行转证券/证券转银行)→ broker ↔ bank 账户转移204001/131810或回购关键字)→ 固定面值 100 CNY/张,利息差额入repo_interest_account输出示例:
富途证券(
futu)USD 计价,自动输出
commodity USD指令。账单导出位置
CLI
-p, --provideralipay|wechat|icbc|yinhe|...)-s, --source-c, --config-g, --global-configconfig/global.yml)-m, --mapping-o, --output--log-levelerror|warn|info|debug|trace--strict-b, --batch常见调试
文档
License
MIT