以TXT為載體的資料交換利用SHELL產生導數指令碼執行個體

來源:互聯網
上載者:User

平時一些資料交流,比如,各地保險行業協會與保險公司之間,很大一部分都是通過文本方式的,

因為這種方式非常靈活,打個包,非常易於後期處理!而如果給你一個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執行一下這個指令碼了

SQL> @tp_claim.sql

其實我們上面要寫成一個指令碼,但事實上,如果要求簡單一點,我們甚至只要一條命令就夠了

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
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.