银行账单转换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.mzph.cn/news/129603.shtml

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

相关文章

Android工具栏ToolBar

主流APP除了底部有一排标签栏外,通常顶部还有一排导航栏。在Android5.0之前,这个顶部导航栏以ActionBar控件的形式出现,但AcionBar存在不灵活、难以扩展等毛病,所以Android5.0之后推出了ToolBar工具栏控件,意在取代Aci…

绝地求生msvcp140.dll丢失报错怎么办,这四个方法都可以解决

在回答这个问题之前,我们先来了解一下什么是msvcp140.dll。msvcp140.dll是微软Visual C 2015 Redistributable的一个组件,它包含了许多运行库文件,用于支持各种应用程序的正常运行。当你在玩《绝地求生》(俗称“吃鸡”&#xff09…

【vscode远程开发】使用内网穿透实现在公网环境下远程访问

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

【TypeScript】认识TypeScript

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录 TypeScriptJavascript的缺点使用TypeScript重构TypeScript的编译环境全局安装TS编译环境TS编译简…

MySQL第三讲·SQL boy的CRUD操作

你好,我是安然无虞。 文章目录 增删查改:如何操作表中的数据?添加数据插入数据记录插入查询结果 删除数据修改数据查询数据select|where|group by|havingfromorder bylimit 增删查改:如何操作表…

Linux常用命令——chattr命令

在线Linux命令查询工具 chattr 用来改变文件属性 补充说明 chattr命令用来改变文件属性。这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式: 语法 chattr(选项)选项 a:让文件或目录仅供附加用途&#xff…

[Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb

一.部署nodejs项目,映射端口,挂载数据卷 可以到https://hub.docker.com/去搜索node镜像,然后下载,也可以直接通过docker pull node下载镜像,然后用这个node镜像启动容器node,这样系统就集成了node服务了,在这里挂载www/node目录到容器中,并指定端口映射,运行nodejs程序,安装npm…

【Elasticsearch 未授权访问漏洞复现】

文章目录 一、漏洞描述二、漏洞复现三、修复建议 一、漏洞描述 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布&am…

TCP的滑动窗口和拥塞控制

目录 滑动窗口 1.发送窗口和接收窗口 2.滑动窗口的分类 停止等待协议:发送窗口大小 1, 接收窗口大小 1 后退N帧协议(GBN):发送窗口大小 > 1,接收窗口大小 1 选择重传协议(SR&#xf…

Linux 安装node并全局可用

前言 基于:操作系统 CentOS 7.6 工具:Xshell7、Xftp7 1.下载 根目录创建一个 node 文件夹并进入 mkdir /node && cd /node下载压缩包 wget https://nodejs.org/download/release/v16.18.0/node-v16.18.0-linux-x64.tar.gz2.解压并重命名 …

Python武器库开发-常用模块之configparser模块(十六)

configparser模块(十六) ConfigParser模块在python3中修改为configparser.这个模块定义了一个ConfigParser类,该模块的作用就是用来读取配置文件的,使用模块中的RawConfigParser()、ConfigParser()、 SafeConfigParser()这三个方法,创建一个…

剑指JUC原理-10.并发编程大师的原子累加器底层优化原理(与人类的优秀灵魂对话)

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码🔥如果感觉博主的文章还不错的话,请👍三连支持&…

第2篇 机器学习基础 —(3)机器学习库之Scikit-Learn

前言:Hello大家好,我是小哥谈。Scikit-Learn(简称Sklearn)是Python 的第三方模块,它是机器学习领域当中知名的Python 模块之一,它对常用的机器学习算法进行了封装,包括回归(Regressi…

5+非肿瘤+细胞凋亡相关生信思路,请自行查阅

今天给同学们分享一篇生信文章“Genome-wide identification and functional analysis of dysregulated alternative splicing profiles in sepsis”,这篇文章发表在J Inflamm (Lond)期刊上,影响因子为5.1。 结果解读: 脓毒症患者和健康对照…

实验室装修公司的线上推广成功案例_上海添力网络科技

2018年7月,也是我的书《快速见效的企业网络营销方法 B2B 大宗B2C》出版后两个月,某装修公司的市场部总监在阅读完这本书后,找到了我,希望能帮到他们公司提升线上获客能力。 当时他们已经成立了线上推广团队,配置了SEM岗…

闯关打卡小程序的效果如何

闯关打卡是一种以任务关卡为基础的打卡模式,管理员可配置活动任务关卡,成员加入任务后需依次解锁,打卡完成任务,像闯关游戏一样完成所有任务。 通过打卡活动聚集一群有共同目标、兴趣的人,通过打卡的方式促进共同目标…

LeetCode:117. 填充每个节点的下一个右侧节点指针 II(C++)

117. 填充每个节点的下一个右侧节点指针 II 题目描述: 给定一个二叉树: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将…

iOS报错命名空间“std”中的“unary_function”

刚刚将我的 Xcode 升级到 15.0,突然它开始在 RCT_Folly 中出现以下错误 No template named unary_function in namespace std; did you mean __unary_function?我尝试删除缓存数据和派生数据并清理构建。也尝试删除 pod 和 node_modules。但没有任何帮助。 于是我…

HTTP 协议请求头 If-Match、If-None-Match 和 ETag

概述 在 HTTP 协议中,请求头 If-Match、If-None-Match、If-Modified-Since、If-Unmodified-Since、If-Range 主要是为了解决浏览器缓存数据而定义的请求头标准,按照协议规范正确的判断和使用这几个请求头,可以更精准的处理浏览器缓存&#x…