`
897371388
  • 浏览: 530635 次
文章分类
社区版块
存档分类
最新评论

切分一个大文件并分装成Excel文件

 
阅读更多

最近在搞活动,给用户发代金券,发了大约300万张,昨天遇到审计提出的要求,要求把用户的id和手机号做个Excel发给他们。我第一反映是应该电话通知他们,这不合适,但沟通的结果是,文件照做,分成多个文件,保证每个文件能打开。

于是有两个要解决的问题,第一:把大文件切分成小文件。第二,把文本转成excel。

目前的情况,文件行数300万,列数2中间以竖线("|")分隔,文件大小150M。

第一:解决切分大文件为小文件的方法:

(1)按大小分,每15M分为一个文件,共10个split -b 15m userIdMobile.txt m15_ 由于总文件大小为150M,每个文件15M会生成10个文件,m15_是文件的前缀,如果不指定,则默认为x,不指生成的文件为xaa,xab,xac,...xaj命名为m15_ aam15_ ab...m15_aj,但是按文件大小分的问题在于,有时候一行会被拆开,比如把用户的id分到两个文件中,所以在处理的时候采用以行分的情况为多。

(2)按行分,文件总行数300万,每个文件30万行,则生成10个文件,cat userIdMobile.txt | split -l 300000 line30000_,生成的文件为line30000_aa到line30000_aj

第二:把文件转成Excel文件,最简单的想法是把刚才的文本文件直接改为以逗号分隔的.csv文件,双击自动使用excel打开,cat line30000_aa | tr "|" "," > line30000_aa.cvs ,通过把竖线替换为逗号并重新输入到文件line30000_aa.cvs 中,实现刚才的想法。结果打开后,由于用户ID过长,以科学计数法显示,而且一但编辑过一个单元格,数据的最低位被改成了0,导致数据错误。

于是,需要使用程序把内容转换一下:

由于文件的行数超过了65535,所以不能使用2003格式的xls,之前使用的写文件的库xlrd(https://pypi.python.org/pypi/xlrd)被我抛弃了,改用openpyxl(https://pypi.python.org/pypi/openpyxl)

[下载,及安装如下:

wget https://pypi.python.org/packages/source/o/openpyxl/openpyxl-1.7.0.tar.gz --no-check-certificate

tar -zxvf openpyxl-1.7.0.tar.gz

cd openpyxl-1.7.0

python setup.py install】


源码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'zhang-long'
import os,sys
from openpyxl.workbook import Workbook
#ExcelWriter,封装了很强大的excel写的功能
from openpyxl.writer.excel import ExcelWriter

if __name__ == '__main__':
    base = "line30000_a"
    ch = ord('a') #97
    for i in range(10):
        file_name = base + chr(ch + i)
        file = open(file_name)
        lines = file.readlines()
        w = Workbook()
        #新建一个excelWriter
        ew = ExcelWriter(workbook = w)
        ws =  w.worksheets[0]
        row = 0L
        for line in lines:
            # user_id|mobile
            # 123|13426301234
            arrs = line.split("|")
            if len(arrs) == 2:
                ws.cell(row=row, column=0).value = "'%s" % arrs[0]
                ws.cell(row=row, column=1).value = "'%s" % arrs[1]
                row +=1
        ew.save(filename = "%s.xlsx" % file_name)
        file.close()


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics