现在我这边有1月到12月的数据,一个excel文件最多大概50万条,需要将这些excel表格中的数据解析之后保存到数据库中,首先想到的是将excel文件转成csv格式再去解析,不过由于数据量太多,可能会因为分隔符导致解析数据的时候出现问题,大量的数据很难确保某条数据中不会出现分隔符,所以还是直接解析excel表格会比较好。
之前使用java的XSSFWorkbook解析大型Excel文件时,遇到内存不足或性能问题。要么就是直接报错要么就是解析特慢,这是因为XSSFWorkbook将整个Excel文档加载到内存中,如果文件过大,会导致内存溢出。
一. python使用pandas分割文件
为了解决这个问题,我这边直接通过python的pandas将一个大文件分割成多个小的文件,分割后的每个文件5000条数据,下面是python分割文件代码:
import pandas as pd
for i in range(1, 13):
# 读取文件
string_i = str(i)
file = pd.read_excel('D:/Desktop/22年数据/历史数据'+string_i+'月.xlsx')
print('执行解析:===> D:/Desktop/22年数据/历史数据'+string_i+'月.xlsx')
# 获取总记录数和总文件数
total_records = len(file)
# 如果一共有10002条,5000一条分一个文件,那么最后的两条也需要单独分一个文件,所以一共是3个文件
total_files = total_records // 5000 + 1
# 打印
print(total_records)
print(total_files)
# 分割数据并保存为多个 Excel 文件
for j in range(total_files):
start_index = j * 5000
end_index = (j + 1) * 5000
sub_df = file[start_index:end_index]
string_j = str(j+1)
sub_df.to_excel(f'D:/Desktop/files/output_'+string_i+'月_'+string_j+'个.xlsx', index=False)
解析完成之后它会将分割后的文件保存在D:/Desktop/files中,并以我们规定的格式命名,规范命名格式也是为了我们后面java中方便读取它。
二. pom.xml导入poi
<!-- Apache POI Excel库 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
&l