银行账单转换beancount

用了beancount来记账后,发现每月的账单手动记是一件极其麻烦的事情。

然后再github搜索一通后,有double-entry-generator(https://github.com/deb-sig/double-entry-generator)能转换支付宝/微信的账单,但是没有自己用的建行和招商。
所有自己写了一个py:

  • 建行能导出的账单是excel格式的直接用;
  • 招商导出的是pdf,幸好还能转成txt,然后自己整理成csv
  • 后续可能会加上深农商和农行,也可能不会,这两张卡用的不多。
import os
import re
import pandas as pd
import numpy as npdir = os.path.dirname(os.path.abspath(__file__))#input_file = "xxxxxx.csv"
input_file = input("输入账单路径:")
bank = input("输入账单归属银行[CCB、CMB、SRCB、ABC]:")     #暂时只有CCB和CMB
output_file = dir + "\\" + bank + ".bean"
config_file = dir + "\\config\\" + bank + ".conf"     #当前config文件夹下的CCB.conf和CMB.conf。#CCB账单excel的整理
def CCB_data(_file_):data = pd.read_excel(_file_)data.columns = ["No","text0","CCY","Yuan","time","cost","bal","text1","text2"]data = data.iloc[2:]#data["time"] = data["time"].str[0:4] + "-" + data["time"].str[4:6] + "-" + data["time"].str[6:8]data["time"] = pd.to_datetime(data["time"]).astype(str)data.loc[:,"account"] = data["text0"] + ":" + data["text2"]data["CCY"] = data["CCY"].replace("人民币元","CNY")data = data[["time","cost","CCY","account","text0","text1","text2"]]#pd.DataFrame(data).to_csv(output_file+".csv",encoding='utf-8-sig')    #可以导出csvreturn data#CMB账单csv的整理
def CMB_data(_file_):data = pd.read_csv(_file_)data.columns = ["time","CCY","cost","bal","text0","text2"]data["time"] = pd.to_datetime(data["time"]).astype(str)data["cost"] = data["cost"].astype(str)data.loc[:,"text1"] = Nonedata.loc[:,"account"] = data["text0"] + ":" + data["text2"]data = data[["time","cost","CCY","account","text0","text1","text2"]]#pd.DataFrame(data).to_csv(output_file+".csv",encoding='utf-8-sig')      #可以导出csvreturn data#关键字查找替换       
def replace(_data_,_config_):        conf = pd.read_csv(_config_)for conf in conf.itertuples():_data_ = _data_.str.replace(".*"+conf[1]+".*",conf[2],regex = True)return _data_#输出beancount格式的字段
def to_bean(_data_):global bankbean = _data_["time"] + ' * \"' +_data_["text0"] + '\"\n\t'if _data_["text1"].notnull().any():bean = bean + 'notes: \"' + _data_["text1"] + '\"\n\t' bean = bean + 'id: \"' + _data_["text2"] + '\"\n\t'bean = bean + "Assets:Bank:" + bank + " " + _data_["cost"] + " " + _data_["CCY"] + "\n\t"bean = bean + _data_["account"] + "\n"return bean#整理账单格式    
if bank == "CCB":DATA = CCB_data(input_file)
if bank == "CMB":DATA = CMB_data(input_file)#按conf文件查找替换关键字
DATA["account"]= replace(DATA["account"],config_file)
#print(DATA)#整理为beancount格式的字段
bean = to_bean(DATA).to_frame()
#print(bean)#输出文件CCB.bean或者CMB.beantext = ""
for bean in bean.itertuples():text = text + str(bean[1]) + "\n"file = open(output_file,'w')
file.write(text)
file.close()

config文件,格式:【关键字,替换后】,例如:

Text,Replace_text
饿了么,Expenses:Food:Others

效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/159562.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch索引按日期拆分

1.索引拆分原因 如果单个索引数据量过大会导致搜索变慢,而且不方便清理历史数据。 例如日志数据每天量很大,而且需要定期清理以往日志数据。例如原索引为sc_all_system_log,现按天拆分索引sc_all_system_log20220902,sc_all_syste…

Linux使用挂载Windows共享文件夹

1、在linux下要挂载windows的共享文件,需要安装cifs-utils软件包。 dpkg -l|grep cifs-utils可以查看是否安装了这个软件包,which mount.cifs可以查看这个软件包安装在哪里。sudo apt-get install cifs-utils可以安装软件包。 2、建立一个目录用来作挂载…

自动驾驶算法(四):RRT*算法讲解与代码实现(基于采样的路径规划)

目录 1 RRT算法和RRT*算法 2 RRT*代码相比于RRT的改进 3 RRT*完整代码 1 RRT算法和RRT*算法 从上篇博客我们可以看出,RRT算法找到最短路径特别快。因为它是一段一段的过去的,但同时它产生的路径也是非常糟糕、随机的只要找到了终点就会结束。 因此我们…

Kafka - 监控工具 Kafka Eagle:实时洞察Kafka集群的利器

文章目录 引言Kafka Eagle简介Kafka Eagle的特点Kafka Eagle的优势使用Kafka Eagle的步骤结论 引言 在现代大数据架构中,Apache Kafka已成为一个不可或缺的组件,用于可靠地处理和传输大规模的数据流。然而,随着Kafka集群规模的不断增长&…

GEE——提取制定多波段影像的属性值(按照制定属性名称和属性值)输出格式为矢量格式

简介: 这里我们很多时候,需要提取制定影像,或者多波段影像制定区域的值,这里有一个问题是我们一般输出的结果仅仅是一个字典类型的对象,而我们不知道如何按照一个矢量输入,这里我们首先要做的就是进行多波段值在制定区域的提取,随后就是分别对其新的字典的键、值的设定…

操作系统 day05(进程)

一,进程的概念 进程和程序的区别 如下图所示:通过多次点击QQ程序,可以打开多个QQ进程 二,进程的组成(更准确的说,应该是进程实体的组成) PCB PCB是进程存在的唯一标志,当进…

数据结构之树(图解)

文章目录 前言一、树是什么?二、树的特点三、树的相关概念四、树的表示方法(孩子兄弟表示法)总结 前言 在学习完线性结构,例如顺序表、链表、栈、队列后,我们要开始学习一个新的数据结构----树 一、树是什么&#xf…

数模国赛——多波束测线问题模型建立研究分析

第一次参加数模国赛,太菜了~~~~意难平 问题一 画出与测线方向垂直的平面和海底坡面的交线构成一条与水平面夹角为𝐀的斜线的情况下的示意图进行分析,将覆盖宽度分为左覆盖宽度和右覆盖宽度,求出它们与海水深度和𝐀、…

RT-Thread系统使用常见问题处理记录

1.使用telnet连接系统时发送help指令显示不全的问题。 原因:telnet发送缓存太小。 解决办法:更改agile_telnet软件包里Set agile_telnet tx buffer size的大小。 2.使用Paho MQTT软件包过一段时间报错hard fault on thread: mqtt0 解决办法&#xff1…

Mysql高级——Mysql8一主一从,多主多从搭建

修改 /etc/hosts文件 ip地址 master1 ip地址 master2 ip地址 slave1 ip地址 slave2一主一从 create database master1db;create table master1db.master1tab(name char(50));insert into master1db.master1tab VALUES(1111);insert into master1db.master1tab VALUES(2222);m…

【Java】多线程案例(单例模式,阻塞队列,定时器,线程池)

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录 实现安全版本的单例模式饿汉模式类和对象的概念类对象类的静态成员与实例成员 懒汉模式如何保证…

无需专线、无需固定公网IP,各地安防数据如何高效上云?

某专注于安防领域的企业,供机场、金融、智慧大厦等行业,包括门禁系统、巡更系统、视频监控在内的整体解决方案。 在实际方案交付过程中,往往需要在多地分支机构分别部署相应的安防设备,并将产生的数据实时统一汇总至云平台进行管理…