天天看點

《懶人Shell腳本》之七——格式化處理資料存入資料庫實作

0、引言

實際應用開發中遇到:将非格式化的檔案資料存儲到資料庫中。對于傳統的格式化的資料:ini/json/xml我們都有現成的類庫去實作。而對于如下非格式化的資料呢?以下是我的思考與實作。

資料截取片段如下所示:

[root@localhost 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.htm
2月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/sh
CONTENT_FILE=./content.txt
URL_FILE=./url.txt
RST_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
 }

#生成sql
function build_rstdate()
{
icnt=1;
cat $CONTENT_FILE | while read line
do
  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 line
do
  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.sql
for((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.sql

done;
}

format_process;
build_rstdate;           

格式化xml腳本實作

[root@localhost 2017]# cat build_input.sh
#!/bin/sh

sed -i 's#</content>#</contentsize>#g' input.xml
sed -i 's#<content>#<contentsize>#g' input.xml
sed -i 's#</snapshot>#</snapshotsize>#g' input.xml
sed -i 's#<snapshot>#<snapshotsize>#g' input.xml
sed -i 's#<is_site_homepage>#</is_site_homepage>#2' input.xml
#在檔案頭插入格式化字元串
sed -i '1i\<?xml version="1.0" encoding="UTF-8"?>' input.xml
sed -i '2i\<HotNewsList>' input.xml
#檔案末尾加入特定字元串
sed -i '$a\</HotNewsList>' input.xml           

4、小結

shell對文本的處理真的非常強大。一些指令行還不能“信手拈來”,有待進一步掌握提高!

作者:銘毅天下

轉載請标明出處,原文位址:

http://blog.csdn.net/laoyang360/article/details/56510665