最近由于业务系统新需求的需要,我们平台需要将供应商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两种方式实现文本处理的长拼接案例的更多相关文章

  1. 基础知识:编程语言介绍、Python介绍、Python解释器安装、运行Python解释器的两种方式、变量、数据类型基本使用

    2018年3月19日 今日学习内容: 1.编程语言的介绍 2.Python介绍 3.安装Python解释器(多版本共存) 4.运行Python解释器程序两种方式.(交互式与命令行式)(♥♥♥♥♥) 5 ...

  2. 周一02.3运行python程序的两种方式

    一.运行python程序的两种方式 方法一:交互式:                     优点:输入一行代码立刻返回结果                      缺点:无法永久保存代码 方法二: ...

  3. 执行python解释器的两种方式

    执行python解释器的两种方式 1.交互式 python是高级语言,是解释型语言,逐行翻译,写一句翻译一句 print ('hello world') 2.命令行式 python和python解释器 ...

  4. 操作系统+编程语言的分类+执行python程序的两种方式+变量

    1.什么是操作系统? 操作系统就是一个协调\管理\控制计算机硬件资源与软件资源的一个控制程序. 2.为何要操作系统? a.把复杂的硬件操作封装成简单的功能\接口用来给用户或者程序来使用(文件) b.把 ...

  5. day05-1 执行Python程序的两种方式

    目录 执行Python程序的两种方式 第一种:交互式 第二种:命令行式 三个步骤 两种方式的区别 执行Python程序的两种方式 第一种:交互式 在cmd中运行 优点:直接给出结果,执行效率高,及时报 ...

  6. Python字符串的两种方式——百分号方式,format的方式

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  7. 编程语言、Python介绍及其解释器安装、运行Python解释器的两种方式、变量、内存管理

    一.编程语言介绍 1.1 机器语言:直接用计算机能理解的二进制指令来编写程序,直接控制硬件. 1.2 汇编语言:在机器语言的基础上,用英文标签取代二进制指令来编写程序,本质上也是直接控制硬件. 以上2 ...

  8. python 发送邮件的两种方式【终极篇】

    一,利用python自带的库 smtplib简单高效 from email.mime.multipart import MIMEMultipart from email.mime.text impor ...

  9. 执行Python程序的两种方式

    目录 交互式(了解) 命令行式(了解) Python执行程序的三个阶段(掌握) 交互式(了解) 交互式环境下,敲完一条命令按下enter键马上能看到结果,调试程序方便.程序无法永久保存,关掉cmd窗口 ...

随机推荐

  1. Java——对象转型

    [对象转型]  

  2. 转载--C 的回归

    转载自http://blog.codingnow.com/2007/09/c_vs_cplusplus.html 周末出差,去另一个城市给公司的一个项目解决点问题.回程去机场的路上,我用手机上 goo ...

  3. ORB an efficient alternative to SIFT or SURF

    AbstractFeature matching is at the base of many computer vision problems, such as object recognition ...

  4. es之java插入优化(批量插入)

    插入文档操作的一种优化,因为每次插入单条文档,都会向es中发送请求.然后es执行在返回结果: 如果有大批量的文档数据需要插入,这个时候单挑插入操作显然是不合理的: 之前学习的命令行批量执行方式: PO ...

  5. UIWebView 禁止检测链接弹出UIActionSheet

    解决方法一: 添加以下代码禁止检测类型 webView.dataDetectorTypes = UIDataDetectorTypeNone; 解决方法二: - (void)webViewDidFin ...

  6. bp文件错误消除

    代码文件报错, error: unused parameter 'data' [-Werror,-Wunused-parameter]‘ 按提示在cflags中加入: "-Wunused-p ...

  7. Linux_SquidProxyServer代理服务器

    目录 目录 Squid proxy server Web proxy server operating principle Squid features Setup squid server Setu ...

  8. spring boot gateway自定义限流

    参考:https://blog.csdn.net/ErickPang/article/details/84680132 采用自带默认网关请参照微服务架构spring cloud - gateway网关 ...

  9. JSONPath解析json

    JSONPath - 用于JSON的XPath 用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具. 考虑到接下来计划开发一个自动化测试平台,在 ...

  10. python 正则表达式 re.match

    #coding:utf-8 import re #匹配内容:单词+空格+单词+任意字符 #\w 单词字符[A-Za-z0-9_] #(?P<name>...) 分组,除了原有的编号外在指定 ...