使用Python和AWK两种方式实现文本处理的长拼接案例
最近由于业务系统新需求的需要,我们平台需要将供应商G提供一类数据转换格式后提供给客户K。比较头疼是供应商G提供的数据都是在Windows下使用Excel存储的,而客户K先前与我们相关对接人员商定的数据类型必须使用utf-8的txt文件,并且由于客户K程序处理的需要,并附带生成一个与该数据文件匹配的校验文件数据传输的结束标志。
主要操作步骤如下:
1,首先得先把.xlsx的后缀改为.csv的后缀另存,这样就可以在Linux中打开了;
2,由于Windows下编码格式基本都是gbk的,所以需要进行转码为utf-8的才能显示正常。
可以使用 iconv -fgbk -tutf8 -c -o to_file from_file 进行转码,转码后文件大致显示如下:
账号,银行,姓名,身份证号,手机号,登录邮箱,嫌疑欺诈账户使用设备,请求类型,,,是否被多家公安机关查询
000167342xxx,深圳农商,深圳市XX仓储服务有限公司,,,,,止付,冻结,明细查询,是
000195557xxx,深圳农商,深圳市XXX鞋材有限公司,,,,,止付,冻结,明细查询,是
000251484xxx,深圳农商,深圳市XXX电子有限公司,,,,,止付,冻结,明细查询,是
实际上只有9列数据,第8、9、10是合并单元格的。
3,客户K要求9列数据使用 “|” 进行分割。
由上面转码后文件内容可知,目前以 “,” 进行分割有11列数据,第8、9、10三列继续使用 “,” 进行分割,其他使用 “|” 进行分割。就我当前知识范围来讲,可以使用两种
方式,一种是使用Python,不过脚本实现起来比较复杂。一种使用AWK的流文本处理,命令简单,建议优先采用。但是也可以使用shell利用for循环进行拼接,但是这种需要消耗大量的系统资源,并且出奇的慢,不建议使用。供应商G提供文件大概有12W行数据,使用这种方式需要近20分钟才能完成。下面分别介绍两种方式:
3.1 Python脚本如下:
import sys
def readfile(rfilename,wfilename):
wfile=open(wfilename,'a+')
#wfile.write('账号|银行|姓名|身份证号|手机号|登录邮箱|嫌疑欺诈账户使用设备|请求类型|是否被多家公安机关查询\n')
#上一行是文件的title,如果不使用这样的方式,就是用下面lines从0,也即是从第一行开始处理
with open(rfilename, 'r') as fr:
lines=fr.readlines()
for line in lines[0:]:
llist=[]
if len(line)>1:
words=line.split(',')
if (words[0]!=''):
llist.append(words[0]+'|')
llist.append(words[1]+'|')
llist.append(words[2]+'|')
llist.append(words[3]+'|')
llist.append(words[4]+'|')
llist.append(words[5]+'|')
llist.append(words[6]+'|')
llist.append(words[7]+',')
llist.append(words[8]+',')
llist.append(words[9]+'|')
llist.append(words[10])
wstr=''.join(llist)
#这里需要指定新文件列之间的分隔符为空,否则每个字段间会有多个分隔符
wfile.write(wstr+'\r')
#这里的行与行之间使用换行符 \r ,而不是使用回车 \n,如果使用回车则新文件中会生成大量空行
wfile.close() if __name__ == '__main__':
inpath=sys.argv[1]
outpath=sys.argv[2]
#指定输入文件的路径和名称
rfilename=inpath+'1111.csv'
#指定输出文件路径和名称
wfilename=outpath+'3333.csv'
readfile(rfilename,wfilename) #执行
[root@A opt] python $python_file $inpath $outpath
速度很快,1秒钟左右12W行就执行完了。
3.2 AWK
awk -F, '{print $1"|",$2"|",$3"|",$4"|",$5"|",$6"|",$7"|",$8",",$9",",$10"|",$11}' .csv | sed 's/ //g' >>ttt2.csv
就这么简单的一个命令,12W行秒完成。
3.3 shell的方式,相比于AWK流文本处理和Python脚本,使用shell处理,至少我想出来的这个方法的确是太蠢了。
#执行前, 我先把,改成|
for line in `cat 3333.txt`
do
echo "`echo "$line" | awk -F "|" 'BEGIN{OFS="|"} {print $1,$2,$3,$4,$5,$6,$7}'`|`echo "$line" | awk -F"|" 'BEGIN{OFS=","} {print $8,$9,$10}'`|`echo "$line" | awk -F "|" 'BEGIN{OFS="|"} {print $11}'`" >> 4444.txt
done #当然情况允许的话, 还可以使用并行
for line in `cat 3333.txt`
do
{
echo "`echo "$line" | awk -F "|" 'BEGIN{OFS="|"} {print $1,$2,$3,$4,$5,$6,$7}'`|`echo "$line" | awk -F"|" 'BEGIN{OFS=","} {print $8,$9,$10}'`|`echo "$line" | awk -F "|" 'BEGIN{OFS="|"} {print $11}'`" >> 4444.txt
}&
done
经过测试发现,并行与否好像没有多大的差别,只是稍微快了那么一丢丢,也需要近20分钟才能完成12W行的拼接。
以上三种方法处理后数据就是下面的了:
账号|银行|姓名|身份证号|手机号|登录邮箱|嫌疑欺诈账户使用设备|请求类型|是否被多家公安机关查询
000167342xxx|深圳农商|深圳市XX仓储服务有限公司|||||止付,冻结,明细查询|是
000195557xxx|深圳农商|深圳市XXX鞋材有限公司|||||止付,冻结,明细查询|是
000251484xxx|深圳农商|深圳市XXX电子有限公司|||||止付,冻结,明细查询|是
001980099990xxx|农业银行|未知|||||,,明细查询|是
4,生成校验文件就很简单了,可以使用MD5的,16位的加密;也可以使用hash的,hash默认是SHA-1的,20位的加密,也有SHA-224、SHA-256、SHA-384
#命令示例
[root@A opt]# md5sum 2222.csv
d6b37d6921b0153079ef6bb976872f01 2222.csv
[root@A opt]# sha1sum 2222.csv
c9e780381f756308362d44172e06e46ee8758ecf 2222.csv
[root@A opt]# sha224sum 2222.csv
1f79435e1f5eefc91b1fabf66df1a25391478e0fa137a526e6bdf66e 2222.csv
[root@A opt]# sha256sum 2222.csv
bf9e8b0b25807e9b31026a56d8dc4040dd4c90e7a468b1a4d91cc3b6866dbb13 2222.csv #生成校验文件
[root@A opt]# md5sum 2222.csv >2222_md5.txt [root@A opt]# sha1sum 2222.csv >2222_sha1.txt #校验文件完整性
[root@A opt]# md5sum -c 2222_md5.txt
2222.csv: OK
[root@A opt]# sha1sum -c 2222_sha1.txt
2222.csv: OK
更多关于校验文件生成的解读详见:https://www.jb51.net/LINUXjishu/156064.html
使用Python和AWK两种方式实现文本处理的长拼接案例的更多相关文章
- 基础知识:编程语言介绍、Python介绍、Python解释器安装、运行Python解释器的两种方式、变量、数据类型基本使用
2018年3月19日 今日学习内容: 1.编程语言的介绍 2.Python介绍 3.安装Python解释器(多版本共存) 4.运行Python解释器程序两种方式.(交互式与命令行式)(♥♥♥♥♥) 5 ...
- 周一02.3运行python程序的两种方式
一.运行python程序的两种方式 方法一:交互式: 优点:输入一行代码立刻返回结果 缺点:无法永久保存代码 方法二: ...
- 执行python解释器的两种方式
执行python解释器的两种方式 1.交互式 python是高级语言,是解释型语言,逐行翻译,写一句翻译一句 print ('hello world') 2.命令行式 python和python解释器 ...
- 操作系统+编程语言的分类+执行python程序的两种方式+变量
1.什么是操作系统? 操作系统就是一个协调\管理\控制计算机硬件资源与软件资源的一个控制程序. 2.为何要操作系统? a.把复杂的硬件操作封装成简单的功能\接口用来给用户或者程序来使用(文件) b.把 ...
- day05-1 执行Python程序的两种方式
目录 执行Python程序的两种方式 第一种:交互式 第二种:命令行式 三个步骤 两种方式的区别 执行Python程序的两种方式 第一种:交互式 在cmd中运行 优点:直接给出结果,执行效率高,及时报 ...
- Python字符串的两种方式——百分号方式,format的方式
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 编程语言、Python介绍及其解释器安装、运行Python解释器的两种方式、变量、内存管理
一.编程语言介绍 1.1 机器语言:直接用计算机能理解的二进制指令来编写程序,直接控制硬件. 1.2 汇编语言:在机器语言的基础上,用英文标签取代二进制指令来编写程序,本质上也是直接控制硬件. 以上2 ...
- python 发送邮件的两种方式【终极篇】
一,利用python自带的库 smtplib简单高效 from email.mime.multipart import MIMEMultipart from email.mime.text impor ...
- 执行Python程序的两种方式
目录 交互式(了解) 命令行式(了解) Python执行程序的三个阶段(掌握) 交互式(了解) 交互式环境下,敲完一条命令按下enter键马上能看到结果,调试程序方便.程序无法永久保存,关掉cmd窗口 ...
随机推荐
- php开发IDE选择
优先选择Netbeans,理由如下:: 1.ZendStudio有的方便特性Netbeans也提供,如:ctrl+f5也支持ctrl+shift+r的文件选择功能,[git | svn]团队代码管理. ...
- 使用 Markdown 写博客
后台设置(左侧边栏区找到-设置默认编辑器). 设置为 Markdown 后保存,即可在编辑新博客时生效.
- 3D Computer Grapihcs Using OpenGL - 10 Color Buffer
本节我们将尝试利用三角形制作一个“走马灯”效果. 一个三角形如图示方式,从左向右依次移动. 先看一下代码: MyGlWindow.cpp #include <gl\glew.h> #inc ...
- BM板子
BM线性递推 玄学玩意 struct LinearRecurrence { using int64 = long long; using vec = std::vector<int64>; ...
- 使用ajax异步下载文件,后端为struts2
前端采用伪表单: 然后调用 后台代码为 效果图:
- 500 cannot be cast to javax.xml.registry.infomodel
在使用mybatis的时候每次一调用一个返回User类型的sql时,总是会报错如下: com.xx.all.domain.User cannot be cast to javax.xml.regist ...
- How to call javascript function on page load in asp.net
How to call javascript function on page load in asp.net 解答1,使用RegisterStartupScript来运行 需要注意的是,下面的dem ...
- windows 2008 gpt
新服务器,4T硬盘,U盘安装Windows Server 2008 R2. 把2008的镜像用UltraISO写入U盘. 安装到分区那块,主分区200G,剩余分区系统自动给分为: 2T + 剩余 两块 ...
- 基于GTID模式MySQL主从复制
基于GTID模式MySQL主从复制 GTID复制原理:基于GTID的复制是MySQL 5.6后新增的复制方式GTID (global transaction identifier) 即全局事务ID, ...
- 职位-CEO:CEO
ylbtech-职位-CEO:CEO 首席执行官(Chief Executive Officer,缩写CEO),职位名称,是在一个企业中负责日常事务的最高行政官员,主司企业行政事务,又称作司政.行政总 ...