Beancount 系列二: Importer 设置
Beancount 虽然可以系统得记录和统计收入和支出,但记录起来不是很方便,根据账单自动化记录数据便会省下大量精力和时间。
综述
Importer
个人理解的作用是将整理好的账单文本转化为Bean记录的形式,即格式化(表格,JSON等)账单 -> Importer -> Beancount 记录,Importer在其中起到一个消费记录格式转化作用。
Beancount 作者对 Importer 有详细的文档叙述,即Importing External Data in Beancount。GitHub@lidingchao也写了简单的sample来实现一个importer。Beancount 官方也有基于机器学习的智能importer beancount/smart_importer。
而我的需求是:
- 基于
csv
的账单生成bean
文件 - 能够自行定制规则来实现对不同消费的分类
正好,Beancount 官方有关于CSV的一个Reader,参考博客beancount 简易入门指南就有了我的实现。
一个例子
准备csv文件
将下面表格生成为CSV文件bill.csv
记账日期 | 交易日期 | 收款人 | 交易摘要 | 人民币金额 | 卡号后四位 | 类别 |
---|---|---|---|---|---|---|
2019-12-03 | 2019-12-04 | 铁路 | 京九线 | 10.00 | 2223 | train |
2019-12-03 | 2019-12-04 | 餐饮 | 老北京火锅 | 300.00 | 8763 | huoguo |
2019-12-03 | 2019-12-04 | 公交 | 120公交车 | 2.00 | 2134 | bus |
准备Import Config
编写Config文件为myconfig.py
如下:
1 |
#!/usr/bin/env python |
说明:
CONFIG
里面可以写多个csv.Importer
,每个 importer 判断自己是否会处理这个文件,如果会处理,交给这个 imoprter 处理导入,并不再往下判断;- importer 源码位于
beancount/beancount/ingest/importers/csv.py
,初始化需要配置以下参数`config
: 第三条细讲account
: 对应的消费账户,一般是借记卡或者信用卡currency
: 币种regexps
,skip_lines
,last4_map
: 不知道,待实践categorizer
: 提供一个函数来对消费进行规则分类,例子中自定义了函数dumb_categorizer
,根据Narration的信息判断是哪种消费
config
里包含了csv.Col.xxx
来自动提取CSV中的信息,importer以键做索引,csv header由值提供ACCOUNT
: 不知道AMOUNT
: 不知道AMOUNT_CREDIT
: 信用卡消费金额AMOUNT_DEBIT
: 借记卡消费金额BALANCE
: 不知道DATE
: 记账日期DRCR
: 不知道LAST4
: 卡号后四位,会以metadata形式记录在账本中NARRATION
: 注释1NARRATION2
: 注释2NARRATION3
: 注释3,如果存在多个注释,账本中会合并为一个并以;
分隔PAYEE
: 收款人TAG
: 标签TXN_DATE
: 交易日期,会以metadata形式记录在账本中TXN_TIME
: 交易时间,会以metadata形式记录在账本中
生成bean账单
执行命令
1 |
bean-extract myconfig.py bill.csv |
得到账单
1 |
**** /xxx/bill.csv |
Done!
Importer in Fava
可视化工具Fava也支持Importer,可以通过设置
1 |
2017-01-01 custom "fava-option" "import-config" "./importers/path/to/importer.py" |
在Fava界面侧栏看到Importer,并手动导入数据。
注 :Importer在Fava中使用的时候metadata会被去除