首先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办公自动化的知识各位大佬给个关注吧!