- 论坛徽章:
- 0
|
本帖最后由 adaready 于 2014-07-22 20:00 编辑
前两天写的一个客户电子渠道多渠道签约新老**渠道签约信息合并的程序。
效率上一般吧,主要在python方便,几千万的数据也就是5-6分钟就跑完了,
比较符合我的期望。
注释的部分是原本期望将结果算好了再输出的,后来发现效率非常差(比现在
的版本要慢近10倍),所以只好在跑出结果的同时直接输出,算起来少了nlogn
的查找。- #coding=gbk
- import sys
- G_CHN={}
- def ScanChnFile(fname):
- fd=open(fname,'r')
- line=''
- while True:
- v=[0,0,0]
- flds=[]
- line=fd.readline()
- if line == "" : break
- try:
- flds=line.strip().split('|')
- (chn_type,chn_cust_no)=(flds[0],flds[1])
- except:
- continue
- if chn_cust_no in G_CHN:
- v=G_CHN[chn_cust_no]
- if chn_type=="01": v[0]|=1
- if chn_type=="02": v[1]|=1
- if chn_type=="05": v[2]|=1
-
- G_CHN[chn_cust_no]=v
- fd.close()
- def RefineCHN():
- idno,flag,keylen='','',0
- it=G_CHN.iteritems()
- while True:
- try:
- idno,flag='','N'
- k,v=it.next()
- keylen=len(k)
- if keylen==15:
- idno=Id15to18(k)
- if keylen == 18:
- idno=Id18to15(k)
- if idno not in G_CHN: #15位或18位只有一条的情况
- flag='Y'
- else:
- vv=G_CHN[idno]
- v[0]|=vv[0]
- v[1]|=vv[1]
- v[2]|=vv[2]
- if keylen==15: #原证件号15位且18位存在的情况下,只取18位那条
- flag='N'
- if keylen==18:
- flag='Y'
- if flag=='Y':
- #print "%s|%d%d%d|%s|" % (k, v[0],v[1],v[2],idno)
- print '{KEY}|{V0}{V1}{V2}|{IDNO}'.format(KEY=k,V0=v[0],V1=v[1],V2=v[2],IDNO=idno)
- # if flag=='Y':
- # v.append((flag,idno))
- # else:
- # v.append((flag,idno))
- # G_CHN[k]=v
- except :
- break
- def Id15to18(idno):
- TailChars="10X98765432"
- WI=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
- try:
- id17=idno[:6]+"19"+idno[6:]
- s=0
- for i in range(len(id17)):
- s+=int(id17[i])*WI[i]
- return id17+TailChars[s%11]
- except:
- return idno
- def Id18to15(idno):
- return idno[:6]+idno[8:17]
- if __name__=="__main__":
- ScanChnFile(sys.argv[1])
- RefineCHN()
- # for (k,v) in G_CHN.items():
- # net,mob,sms,flag,idno=v[0],v[1],v[2],v[3][0],v[3][1]
- # if(flag=='Y'):
- # print "%s|%d%d%d|%s|" % (k,net,mob,sms,idno)
复制代码 |
|