银行账单转换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 np
 
dir = 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')    #可以导出csv
        return 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"] = None
        data.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')      #可以导出csv
        return 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 bank
        bean = _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

效果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus+Node_exporter+Grafana实现监控主机

PrometheusNode_exporterGrafana实现监控主机 如果没有安装相关的配置,首先要进行安装配置,环境是基于Linux,虚拟机的相关环境配置在文末给出,现在先讲解PrometheusNode_exporterGrafana的安装和使用。 一.Prometheus安装 虽然…

vue-浏览器安装Vue开发者工具

极简插件:下载->开发者模式->拖曳安装->插件详情允许访问文件 网址:https://chrome.zzzmh.cn/index 搜索Vue Devtools 下载下来的安装包先解压 然后点击chrome浏览器的右上角三个点的按钮在里面找到扩展程序这个选项,然后点进去管理…

我在Vscode学OpenCV 基本的加法运算

根据上一篇我们可知__图像的属性 链接:《我在Vscode学OpenCV 处理图像》 属性— API 形状 img.shape 图像大小 img.size 数据类型 img.dtype  shape:如果是彩色图像,则返回包含行数、列数、通道数的数组;如果是二值图像或者灰度…

Java高级互联网架构师之路:垃圾回收器的介绍

本文重点 从本文开始我们将开启垃圾回收器的介绍了,我们知道垃圾回收算法是逻辑改变,而垃圾回收器是具体的实现。我们前面介绍的垃圾回收器有7个,本文将在添加三个,但是这三个目前来看不是很常用,我们只了解一下,我们主要还是讲解这7个垃圾回收器。 十个垃圾回收器 目…

【漏洞库】XXL-JOB 默认accessToken权限绕过导致RCE

文章目录 漏洞描述漏洞编号漏洞评级影响版本漏洞复现- EXP 编写 漏洞挖掘修复建议 漏洞描述 XXL-JOB 是一款开源的分布式任务调度平台,用于实现大规模任务的调度和执行。 XXL-JOB 默认配置下,用于调度通讯的 accessToken 不是随机生成的,而…

如何记录每天的工作日程?电脑手机通用的日程管理软件

在工作时间有限,但工作任务愈加繁多的现在职场中,要求每一个职场人士做好高效日程管理。通过高效管理日程,我们可以更好地组织和安排任务,合理分配时间和优先级,这有助于我们更专注地进行工作,减少时间的浪…

手写操作系统篇:实现裸机应用程序

文章目录 前言操作系统执行环境创建裸机平台项目Rust的Core库移除标准库依赖Qemu 启动流程内存布局编译流程内核的初始指令调整内核的内存布局手动加载内核可执行文件使用RustSBI提供的服务添加bootloader模块添加Makefile运行停止总体架构 前言 我们既然是手写操作系统&#…

行业追踪,2023-11-03

自动复盘 2023-11-03 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

学习小结,学而时习之,坚持学习之,温顾学习之

学习python一个多月了,之前也有接触过,还花了不少钱报班,看了看入门的头两节课,就止步了。每一种编程语言的入门感觉都差不多,学到现在,我对python的基本数据类型还是没掌握好啊,每次列表字典怎…

js 根据word文档模板导出内容

一、创建word导出模板 1、本地创建一个test.docx 2、将最终需要的文档内容及样式编辑完成(图1) 3、将所需动态值的位置,替换为变量参数(图2) 注: 动态值书写 图1 图2 模板值的书写要求 二、项目中使用 1、安装依赖 npm install docxtemplater-image-module-free --save n…

4+m6A+机器学习+分型,要素过多,没有思路的同学可借鉴

今天给同学们分享一篇生信文章“Diagnostic, clustering, and immune cell infiltration analysis of m6A regulators in patients with sepsis”,这篇文章发表在Sci Rep.期刊上,影响因子为4.6。 结果解读: 脓毒症中m6A调节因子的转录改变 …

[PyTorch][chapter 61][强化学习-免模型学习1]

前言: 在现实的学习任务中,环境 其中的转移概率P,奖赏函数R 是未知的,或者状态X也是未知的 称为免模型学习(model-free learning) 目录: 1: 蒙特卡洛强化学习 2:同策略-蒙特卡洛强化学习 3&am…

非关系型数据库Redis的安装【Linux】及常用命令

前言 Redis(Remote Dictionary Server)是一种开源的内存数据库管理系统,它以键值存储方式来存储数据,并且支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。Redis最初由Salvatore Sanfilippo开发&#xff0c…

Java配置47-Spring Eureka 未授权访问漏洞修复

文章目录 1. 背景2. 方法2.1 Eureka Server 添加安全组件2.2 Eureka Server 添加参数2.3 重启 Eureka Server2.4 Eureka Server 升级版本2.5 Eureka Client 配置2.6 Eureka Server 添加代码2.7 其他问题 1. 背景 项目组使用的 Spring Boot 比较老,是 1.5.4.RELEASE…

React使用富文本CKEditor 5,上传图片并可设置大小

上传图片 基础使用(标题、粗体、斜体、超链接、缩进段落、有序无序、上传图片) 官网查看:https://ckeditor.com/docs/ckeditor5/latest/installation/integrations/react.html 安装依赖 npm install --save ckeditor/ckeditor5-react cked…

【window系统】win10家庭版没有hyper-V的选项 问题解决办法

目录 事件起因环境和工具操作过程参考内容结束语 事件起因 在给我的新电脑安装docker和对应的Linux环境时 在 控制面版-程序-启用该或关闭Windows功能 时 没有找到对应网上那种教程里的Hyper-V的功能的选项,查找了一下,说是win10家庭版没有这个功能 专…

速学数据结构 | 循环队列怎么写才最高效?只需要掌握这些技巧

🎬 鸽芷咕:个人主页 🔥 个人专栏:《Linux深造日志》《C干货基地》 ⛺️生活的理想,就是为了理想的生活! 文章目录 📋 前言一、什么是循环队列?二、如何实现循环队列?2.1 循环队列的结构2.2 循环…

SpringBoot集成MyBatis-Plus

SpringBoot集成MyBatis-Plus 文章目录 SpringBoot集成MyBatis-Plusapplication.ymlpom.xmlpojomapperserviceserviceimplconfigutilsweb 懒得打一遍,直接copy: SpringBoot集成MyBatis-Plus application.yml # 端口 server:port: 8080 # 数据源 spring:…

期中成绩怎么发布?

作为一名老师,期中考试结束后,你可能正在为如何发布成绩而烦恼。传统的纸质方式不仅耗时而且容易出错,那么有没有一种方式可以让学生自助查询成绩呢?答案是肯定的。下面就为你介绍几种实用的方法,让成绩发布变得轻松又…

默认路由配置

默认路由: 在末节路由器上使用。(末节路由器是前往其他网络只有一条路可以走的路由器) 默认路由被称为最后的关卡,也就是静态路由不可用并且动态路由也不可用,最后就会选择默认路由。有时在末节路由器上写静态路由时…