標籤:null hashmap 最大的 news 項目 ring ref str one
0、引言
實際應用開發中遇到:將非格式化的檔案資料存放區到資料庫中。對於傳統的格式化的資料:ini/json/xml我們都有現成的類庫去實現。而對於如下非格式化的資料呢?以下是我的思考與實現。
資料截取片段如下所示:
[[email protected] 2017]# head -n 10 input.txt[url]http://epaper.tianjinwe.com/mrxb/mrxb/2013-02/21/content_7566593.htm新報訊【記者王晶通訊員趙子強】對31.66萬平方米的舊樓進行改造,建成豐達園二期配套幼兒園,全年新增就業3600人,城鄉居民醫學保險參保率達100%……津南區鹹水沽鎮2017年度為民服務十項民心工程確定,涉及基礎設施、教育、環境治理、居民保障增收、困難群眾生活等多個方面。 今年,鹹水沽鎮將加快示範鎮建設進程,啟動四裡沽村住宅拆遷,完成博雅時尚三期16.5萬平方米還遷房全部配套工作,完成東張莊、北洋村還遷工作,啟動金豐裡四、五號庫項目31.15萬平方米的還遷工作,保證吳稻地、李莊子、潘莊子村群眾順利還遷。同[url]http://epaper.tianjinwe.com/mrxb/mrxb/2013-02/21/content_7566617.htm2月21日 星期二 天津衛視(101) 19:30 快樂生活劇場:星光燦爛(5、6) 21:25 幸福來敲門 天視1套(102) 18:30 都市報道60分 19:30 第1觀察 21:00 新聞延長線 21:30 熱播1小時 天視2套(103) 18:40 多彩劇場:老公們的私房錢(47);咱家(1、2) 21:10 音樂視界 天視3套(104) 20:00 晚八點劇場:戰神之血染的青春(21-23) 22:40 晚間劇場:山河同在(42、43) 天視5套(106) 18:00 旗開得勝 19:30 我是棋王(23) 21:35 科學健身一點通 21:45 一馬當先 22:00 牌王看牌 天視6套
1、思路探討
1)轉化為格式化資料。
如何將一大段的包含換行、任意特殊字元的變數的常值內容賦值格式化是個問題?
2)檔案讀取,儲存為不同的兩個變數。根據檔案特點,無非是:url作為key,漢字的內容作為value。用Map或者HashMap儲存即可。這裡不論是用C++或Java讀檔案,都是一筆不小的工作量開銷。但我的時間只允許1個小時左右。
綜上,選擇shell指令碼做格式化處理。
大致思路是:
1)url行保留,便於提取。
2)剩下的未被格式化的文本,刪除空行、刪除分行符號,添加content的標記,便於提取。
3)一次提取一個url與之對應的content,構造成所需要的sql即可。
2、核心實現步驟第1步:格式化文字檔
在url行的下一行的首部添加content=,目的:便於進行檢索。
sed -i ‘/^\[url/ { n; s/^/content=/; }‘ $RST_FILE
第2步:刪除空行
sed -i ‘/^$/d‘ $RST_FILE
第3步:提取url
cat $RST_FILE | grep url > $URL_FILE
第4步:刪除處理過的url行
sed -i ‘/url/d‘ $RST_FILE
第5步:分行符號替換為空白格
sed -i ‘:a;N;$ s/\n/ /g;ba‘ $RST_FILE
第6步:content前加分行符號
sed -i ‘s#content#\ncontent#g‘ $RST_FILE
第7步:提取content到content.txt
cat $RST_FILE | grep content > $CONTENT_FILE
3、指令碼源碼
分割為兩個檔案逐行進行遍曆。
#!/bin/shCONTENT_FILE=./content.txtURL_FILE=./url.txtRST_FILE=./input.txt#格式檔案function format_process(){ sed -i ‘/^\[url/ { n; s/^/content=/; }‘ $RST_FILE sed -i ‘/^$/d‘ $RST_FILE cat $RST_FILE | grep url > $URL_FILE #刪除處理過的url行 sed -i ‘/url/d‘ $RST_FILE sed -i ‘:a;N;$ s/\n/ /g;ba‘ $RST_FILE sed -i ‘s#content#\ncontent#g‘ $RST_FILE cat $RST_FILE | grep content > $CONTENT_FILE }#產生sqlfunction build_rstdate(){icnt=1;cat $CONTENT_FILE | while read linedo mkdir -p ./output#產生每個獨立的content檔案 echo $line > ./output/content_${icnt}.txt sed -i ‘s#content\=##g‘ ./output/content_${icnt}.txt icnt=$[$icnt+1]; echo icnt=$icnt;done;export gcnt=0;iurlcnt=0;cat $URL_FILE | while read linedo iurlcnt=$[$iurlcnt+1]; echo $iurlcnt > ./output/.cnts_rst.txt#產生每個獨立的url檔案 echo $line > ./output/url_${iurlcnt}.txt sed -i ‘s#\[url\]##g‘ ./output/url_${iurlcnt}.txt #export gcnt=$iurlcnt;done;gcnt=`cat ./output/.cnts_rst.txt`echo gcnt=$gcnt#構造成sql檔案cat /dev/null > update_sql.sqlfor((i=1;i<=$gcnt;i++))do url=`cat ./output/url_${i}.txt`; content=`cat ./output/content_${i}.txt`; # echo url=$url # echo content=$content echo "update gather_rst set content=‘$content‘ where url=‘$url‘;" >> update_sql.sqldone;}format_process;build_rstdate;
格式化xml指令碼實現
[[email protected] 2017]# cat build_input.sh#!/bin/shsed -i ‘s#</content>#</contentsize>#g‘ input.xmlsed -i ‘s#<content>#<contentsize>#g‘ input.xmlsed -i ‘s#</snapshot>#</snapshotsize>#g‘ input.xmlsed -i ‘s#<snapshot>#<snapshotsize>#g‘ input.xmlsed -i ‘s#<is_site_homepage>#</is_site_homepage>#2‘ input.xml#在檔案頭插入格式化字串sed -i ‘1i\<?xml version="1.0" encoding="UTF-8"?>‘ input.xmlsed -i ‘2i\<HotNewsList>‘ input.xml#檔案末尾加入特定字串sed -i ‘$a\</HotNewsList>‘ input.xml
4、小結
shell對文本的處理真的非常強大。一些命令列還不能“信手拈來”,有待進一步掌握提高!
20170222 22:36 於家中床前
銘毅天下
轉載請標明出處,原文地址:
http://blog.csdn.net/laoyang360/article/details/56510665
如果感覺本文對您有協助,請點擊‘頂’支援一下,您的支援是我堅持寫作最大的動力,謝謝!
《懶人Shell指令碼》之七——格式化處理資料存入資料庫實現