用python按某列值拆分excel表格程序及优化
需求
- 要处理几个七八百兆大的csv文件,需求是把它里面每个站的数据拆分成单独的excel文件。
- 网上有现成的方方格子软件,处理起来发现挺慢,要花5天多时间
- 站的数量有上千个,用excel2010打开一个csv也显示不全,
不知道如果导入access或者单机的mysql,oracle里执行下会不会很快,试了下access,版本是2010的,导入csv文件表头处理的就有问题,看来用access不是很理想。
- 先想到了用excel自带的VBA来处理下,自己没学过,只是通过搜索来自编程序,结果卡在了
永远只能复制第一行到新表里,复制其他行就是不往下走,不知道如何解决,有高手看到了请帮忙看看此问题已解决,使用Application.CutCopyMode = False就可以搞定,不过貌似执行起来速度挺慢。
- 于是改用python来处理,百度了很多案例学习了下,改成了真正能实现的代码,跑了一个470MB的文件居然花了约8小时,加了个调试为了看进度,结果跑700MB的文件居然花了24小时居然只处理了十分之一数据,这才拿一部分数据试了下加调试信息和不加的差异,发现果然很大,有的语句尽管没开开关,但只要放在循环里就很耗时,必须注销掉。
- 优化后估算700MB的文件只要跑约9小时。
VBA代码
Sub ExtractBySite()
Dim Wb1, Wb2, Wb3 As Workbook
Dim cPath$, siteName$, newFilePath$
cPath = ThisWorkbook.Path & "\" '获取本文件所在路径
Set Wb1 = ThisWorkbook '如果放在本文件中执行则直接用这个读取站点信息
'提示选择数据文件
MsgBox ("请选择要拆分的数据文件")
FilePathFull = Application.GetOpenFilename("所有文件 (*.*), *.*", 0, "选定文件", , False)
If FilePathFull <> "False" Then
Filename = Right(FilePathFull, Len(FilePathFull) - InStrRev(FilePathFull, "\"))
FilePath = Left(FilePathFull, Len(FilePathFull) - Len(Filename))
FileHead = Left(Filename, InStrRev(Filename, "-") - 1)
&#