最近在搞活动,给用户发代金券,发了大约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()