以TXT为载体的数据交换利用SHELL生成导数脚本实例
2010-01-13 17:04
549 查看
平时一些数据交流,比如,各地保险行业协会与保险公司之间,很大一部分都是通过文本方式的,
因为这种方式非常灵活,打个包,非常易于后期处理!而如果给你一个mdb,或者xls毕竟就没那么容易搞定了,
这些数据有时候可能都是几百万条记录,你能想像xls要怎么做吗?而且,你要把这些数据导入你的数据库,
那你不得不为你这个再开发一个程序,多不划算啊!
可能你也会想如果是文本不需要开发吗?也许,习惯win平台的我们马上想起了UE,
无敌列编辑模式(ALT+C),但是,碰到那种字段长度并不完全相同的情况是不是只能想死呢?
其实呢,借助强大的SHELL,我们根本无需开发什么,我们只是写点简单的脚本,同样可以零活到家。
下面这个是真实案例,为数据的安全性,我对原数据稍微做了处理!
我们先看一下从行业协会过来的数据(下载)的基本结构
从数据来看,总共有6个字段,并以分割符”|,|”,并且第六个字段有可能为空
这里简单的介绍一下目标,我们会以第二列为主键,更新某张表的两个字段,分别为第三列,和第六例
很明显 ,这种情况下用强大的AWK明显是最合适的,先看一下脚本
awk脚本
这个脚本很简单的,都是在讨论如何输出SQL语句,
用到了AWK的三个函数print、printf和length,看这字面的意思,也不用多解析了,跟C有点像
要注意的是printf不会输出换行符,及字符串中'%s',格式化字符
第三行中,如果最后一列不为空,多更新一个字段,仅此而已
然后,我们执行一下,我们可以先修改一下脚本为可执行文件,然后打印文本,利用管道技术,将字段分割符'|'连接,
并将分割符'|,|’用tr命令进行替换,并使用
我们刚才的脚本进行处理,并将处理结果集输出为tp_claim.sql
剩下的就是我们用sqlplus执行一下这个脚本了
解释一下,上面用到了同样无比强大的sed进行替换,s代表替换,将|,|替换为空格,
我们在vi里面也经常这么用,如:
:%s/|,|/ /g
在上上文中,我们使用的是tr命令
并用管道连接起来,其中awk命令中的\047代表单引号,虽然是别扭了一点,
题外话,想输出单引号还真是有点麻烦,不知道有没有谁有更好的办法
awk ‘BEGIN{print “\047”}'
awk "BEGIN{print \"'\"}"
总结:
shell的文本能力真是无比强大,甚至可以join,
如果各位正在考虑数据交换的格式的时候,还是多多考虑一下TXT吧,这才是王道
少用XML,最重要的是不要用二进制的格式(比如.xls,.mdb等)吧,
当然,大部分人可能是在window下面写代码,毕竟是大多数人的选择,那就装一个Cygwin,
玩一玩SHELL,给你全新的体验
Technorati 标签: shell,linux,导数,awk,数据交换,Cygwin
因为这种方式非常灵活,打个包,非常易于后期处理!而如果给你一个mdb,或者xls毕竟就没那么容易搞定了,
这些数据有时候可能都是几百万条记录,你能想像xls要怎么做吗?而且,你要把这些数据导入你的数据库,
那你不得不为你这个再开发一个程序,多不划算啊!
可能你也会想如果是文本不需要开发吗?也许,习惯win平台的我们马上想起了UE,
无敌列编辑模式(ALT+C),但是,碰到那种字段长度并不完全相同的情况是不是只能想死呢?
其实呢,借助强大的SHELL,我们根本无需开发什么,我们只是写点简单的脚本,同样可以零活到家。
下面这个是真实案例,为数据的安全性,我对原数据稍微做了处理!
我们先看一下从行业协会过来的数据(下载)的基本结构
$ tail tp_claim.txt XXXX02|,|7802410222009000261|,|80XXXX020000000000115156175N|,|6802410222009000039A|,|23XXXX0290000000000100915307E|,|84XXXX020000000000116295906E XXXX02|,|7802410222009000263|,|80XXXX020000000000115170337N|,|6802410222009000126|,|23XXXX0290000000000100918119E|,|
从数据来看,总共有6个字段,并以分割符”|,|”,并且第六个字段有可能为空
这里简单的介绍一下目标,我们会以第二列为主键,更新某张表的两个字段,分别为第三列,和第六例
很明显 ,这种情况下用强大的AWK明显是最合适的,先看一下脚本
awk脚本
#!/bin/awk -f BEGIN{ #FS="|,|"; } { printf "update t_upd_bj_buss_claim set claim_code='%s',c_state='1'",$2; printf " where c_comm_typ = '0' and c_rpt_no = '%s';\n",$3; if(length($6)!=0) { printf "update t_upd_bj_buss_claim set c_clm_cnfrm_cde='%s',c_state='1'",$6; printf " where c_comm_typ = '2' and c_rpt_no = '%s';\n",$3; } print ""; } END{ #print "exit";
这个脚本很简单的,都是在讨论如何输出SQL语句,
用到了AWK的三个函数print、printf和length,看这字面的意思,也不用多解析了,跟C有点像
要注意的是printf不会输出换行符,及字符串中'%s',格式化字符
第三行中,如果最后一列不为空,多更新一个字段,仅此而已
然后,我们执行一下,我们可以先修改一下脚本为可执行文件,然后打印文本,利用管道技术,将字段分割符'|'连接,
并将分割符'|,|’用tr命令进行替换,并使用
我们刚才的脚本进行处理,并将处理结果集输出为tp_claim.sql
$chmod +x tp_claim.awk $cat tp_claim.txt|tr '|,|' ' '|./tp_claim.awk > tp_claim.sql
剩下的就是我们用sqlplus执行一下这个脚本了
sed -e 's/|,|/ /g' tp_claim.txt | awk '{print "update t_upd_bj_claim set claim_code=\047$3\047 where c_rpt_no = \047$2\047;"}'
解释一下,上面用到了同样无比强大的sed进行替换,s代表替换,将|,|替换为空格,
我们在vi里面也经常这么用,如:
:%s/|,|/ /g
在上上文中,我们使用的是tr命令
并用管道连接起来,其中awk命令中的\047代表单引号,虽然是别扭了一点,
题外话,想输出单引号还真是有点麻烦,不知道有没有谁有更好的办法
awk ‘BEGIN{print “\047”}'
awk "BEGIN{print \"'\"}"
总结:
shell的文本能力真是无比强大,甚至可以join,
如果各位正在考虑数据交换的格式的时候,还是多多考虑一下TXT吧,这才是王道
少用XML,最重要的是不要用二进制的格式(比如.xls,.mdb等)吧,
当然,大部分人可能是在window下面写代码,毕竟是大多数人的选择,那就装一个Cygwin,
玩一玩SHELL,给你全新的体验
Technorati 标签: shell,linux,导数,awk,数据交换,Cygwin
相关文章推荐
- 在Windows、Linux下,分别利用BAT批处理文件和Shell脚本,生成类似“20150605_111327.txt”命名的文件
- shell 脚本简单txt文本数据操作
- 一个shell脚本,实现利用OpenSSL生成X509证书
- shell脚本利用Here Document ,打包C的源码并编译生成再执行。shell携代攻击程序
- Python测试用例生成脚本(合并相应单元格以及写入单行数据)代码实例
- 利用Shell脚本将MySQL表中的数据转化为json格式
- [实例]利用php+mysql完成shell脚本的授权验证
- 利用存储过程数据库中的数据生成txt文件
- 写一个shell脚本利用wget抓取股票历史数据
- 创建shell脚本,利用for循环箱向日志文件中插入n条数据
- shell脚本实现快速生成xml格式sitemap实例分享
- openstack shell脚本 利用curl 删除实例 API
- iOS利用(Shell脚本)自动打包项目工程生成ipa
- 利用Python爬取微博数据生成词云图片实例代码
- 利用存储过程,生成N行数据进行压力测试脚本
- 利用Shell脚本实现自动备份VPS数据到Dropbox
- caffe利用shell创建train.txt和val.txt做数据输入
- 利用Shell脚本将MySQL表中的数据转化为json格式
- Python测试用例生成脚本(合并相应单元格以及写入单行数据)代码实例
- 利用python脚本生成caffe的prototxt文件