首先Excel文件多表对多表之间的匹配(VLOOKUP),有多种办法,
1:将Excel文件导入Mysql或其他数据库,然后将两种表合并成一张表,接着用数据库匹配 2:将两种表内容,复制粘贴到一起,各自分别保存成一张表,然后VLOOUP,这是最普通的做法 3:将想要匹配的多张表的匹配项做成json文件,然后合并多个json文件,接着用想要匹配的表依次去匹配合并后的json,这样有个好处,就是速度快,而且是每个单独分开的
我今天分享的是第三种方法,下面我用小例子,来说明一下我的需求:
首先我有三张虚拟表,表头如下,其中字段:【证件号】,是空的,它的值是通过姓名(假设姓名是为一项),去另外3张表里去匹配,当然可能匹配不到
下面是原始表(我工作中遇到的是30张表!!!)
下面三张是想要匹配的表(我工作中遇到的实际情况是30多张表,每张表90多万行🤣)
所以到这里,我的需求已经显而易见了,这里的表数据量都是比较少的,实际情况上面也讲了,数据量非常庞大,那么如何解决呢,我分成了4步
第 1 步
先将所有数据转换成csv格式
代码
import os
import time
import pandas as pd
def xlsx2csv ( ) : t1 = time. time( ) for f in os. listdir( "原始表/" ) : data = pd. read_excel( "原始表/" + f, index_col= 0 ) data. to_csv( "csv版" + f + '.csv' , encoding= 'utf-8' ) print ( "写入完成......" ) t2 = time. time( ) print ( t2 - t1)
xlsx2csv( )
第2 步
将匹配项转为json文件 下面这行代码是准备做字典,元组中的第一个参数是键,第二参数是值(可以拼接写法,如d[1]+d[2],或这用符号隔开方便切割,如d[1]+‘-’+d[2]) list_a.append((d[0], d[0])) 1
其实我这个代码是可以包含重复的键的,如若包含重复的键,它会把多个值放在列表里
下面视频中我的值的索引写错了,大家忽略,后来我改了,但是视频已经录好了看🤣
代码
import csv
import os
from collections import defaultdict
def write_json ( ) : for f in os. listdir( "./csv版/" ) : with open ( "./csv版/" + f, newline= '' , encoding= 'utf-8' ) as csvfile: reader = csv. reader( csvfile, delimiter= ',' , quotechar= '"' ) print ( f, "加载完毕" ) list_a = [ ] for d in reader: list_a. append( ( d[ 0 ] , d[ 0 ] ) ) d = defaultdict( list ) for key, value in list_a: d[ key] . append( value) with open ( f"./json文件/ { f. split( '.' ) [ 0 ] } .json" , "w" , encoding= "utf-8" ) as f2: f2. write( json. dumps( d, ensure_ascii= False ) ) write_json( )
第 3步
合并上一步的json文件。
代码
import json
import os
def merge_json ( ) : merged_data = { } for file in os. listdir( "./json文件/" , ) : with open ( "./json文件/" + file , 'r' , encoding= "utf-8" ) as f: data = json. load( f) merged_data. update( data) print ( file ) with open ( "合并json/mergr.json" , 'w' , encoding= "utf-8" ) as f: json. dump( merged_data, f, ensure_ascii= False ) print ( "合并成功!" ) merge_json( )
第 4 步,最后一步啦!!
1、 把第一步的转换成功的csv文件,放入文件夹【数据源】准备读取 2、加载刚刚合并后的json文件 3、开始匹配 4、保存
奉上完整版代码
'''作者:一晌小贪欢
手机:xxxx
'''
import csv
import json
import os
import time
from collections import defaultdict
import pandas as pd def xlsx2csv ( ) : t1 = time. time( ) for f in os. listdir( "原始表/" ) : data = pd. read_excel( "原始表/" + f, index_col= 0 ) data. to_csv( "csv版" + f + '.csv' , encoding= 'utf-8' ) print ( "写入完成......" ) t2 = time. time( ) print ( t2 - t1)
xlsx2csv( ) def write_json ( ) : for f in os. listdir( "./csv版/" ) : with open ( "./csv版/" + f, newline= '' , encoding= 'utf-8' ) as csvfile: reader = csv. reader( csvfile, delimiter= ',' , quotechar= '"' ) print ( f, "加载完毕" ) list_a = [ ] for d in reader: list_a. append( ( d[ 0 ] , d[ 1 ] ) ) d = defaultdict( list ) for key, value in list_a: d[ key] . append( value) with open ( f"./json文件/ { f. split( '.' ) [ 0 ] } .json" , "w" , encoding= "utf-8" ) as f2: f2. write( json. dumps( d, ensure_ascii= False ) ) write_json( ) def merge_json ( ) : merged_data = { } for file in os. listdir( "./json文件/" , ) : with open ( "./json文件/" + file , 'r' , encoding= "utf-8" ) as f: data = json. load( f) merged_data. update( data) print ( file ) with open ( "合并json/mergr.json" , 'w' , encoding= "utf-8" ) as f: json. dump( merged_data, f, ensure_ascii= False ) print ( "合并成功!" ) merge_json( ) def main ( ) : t1 = time. time( ) with open ( "合并json/mergr.json" , "r" , encoding= "utf-8" ) as f: res = json. load( f) t2 = time. time( ) print ( t2 - t1) for f_n in os. listdir( "./数据源/" ) : with open ( "./结果/" + f_n, "w" , newline= '' , encoding= "utf-8" ) as f1: f1 = csv. writer( f1) f1. writerow( [ '姓名' , '地址' , '电话' , '电子邮件' , '出生日期' , '公司' , '职位' , '信用卡号码' , 'IBAN' , 'IP地址' , '证件号' ] ) with open ( "./数据源/" + f_n, newline= '' , encoding= 'utf-8' ) as csvfile: reader = csv. reader( csvfile, delimiter= ',' , quotechar= '"' ) print ( f_n, "加载完毕" ) count = 0 for d in reader: count+= 1 if count == 1 : continue id_ = res. get( d[ 0 ] , '-' ) if id_ != '-' : id_ = id_[ 0 ] d[ - 1 ] = id_f1. writerow( d) main( )
这个就是今天分享的小工具,希望对整天面对账单、报表的财务们有所帮助!!
致力于办公自动化的小小程序员一枚#
都看到这了,关注+点赞+收藏=不迷路!!
如果你想知道更多关于Python办公自动化的知识各位大佬给个关注吧!