最近由于业务系统新需求的需要,我们平台需要将供应商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

  

最新文章

  1. 签名、BOM头、编码、Windows记事本编码、java编码解码的那些事
  2. HTML CSS样式表布局
  3. RS485模块(485与TTL信号的转换)
  4. 让C# Excel导入导出,支持不同版本的Office
  5. 查询oracle表和sql数据量大小
  6. 在struts2中整合ajax时出现Template /template/ajax/head.ftl not found错误时的处理方法
  7. call、apply以及bind
  8. 浅谈javascript中stopImmediatePropagation函数和stopPropagation函数的区别
  9. ural 1989 subplindromes
  10. 阿里云Https部署网站
  11. 栏目class导航
  12. 算法题丨3Sum Closest
  13. 个人建站&mac下安装hexo
  14. Linux文件的扩展名--2019-04-25
  15. Codeforces 677 - A/B/C/D/E - (Undone)
  16. ElasticSearch 批量增加索引
  17. JavaSE学习总结(五)——封装,继承,多态很简单
  18. How To Use XDOLoader to Manage, Download and Upload Files? (DOC ID 469585.1)
  19. 深入redis内部--实现双向链表
  20. 使用 ant 构建的一个例子

热门文章

  1. (10)python学习笔记一
  2. es之关于consistency(数据一致性问题)
  3. SQL JOIN INNER LEFT RIGHT FULL
  4. BBED ORA-00600: internal error code, arguments: [16703], [1403], [20], [], [], [], [], [], [], [], [], []
  5. 洛谷P2657 windy数
  6. LongAccumulator 源码分析
  7. Sqlserver 中间表的操作
  8. spring boot gateway自定义限流
  9. spring,springMVC的优点和区别
  10. Good teachers,they inspire you, they entertain you,and you end up learning a ton even when you don't know it.