《懒人Shell脚本》之七——格式化处理数据存入数据库实现

网友投稿 583 2022-10-29

《懒人Shell脚本》之七——格式化处理数据存入数据库实现

《懒人Shell脚本》之七——格式化处理数据存入数据库实现

0、引言

实际应用开发中遇到:将非格式化的文件数据存储到数据库中。对于传统的格式化的数据:ini/json/xml我们都有现成的类库去实现。而对于如下非格式化的数据呢?以下是我的思考与实现。

数据截取片段如下所示:

[root@localhost 2017]# head -n 10 input.txt[url] 如何将一大段的包含换行、任意特殊字符的变量的文本内容赋值格式化是个问题?

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步:删除空行

-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/-ts_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/-ts_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脚本实现

[root@localhost 2017]# cat build_input.sh#!/bin/shsed -i 's###g' input.xmlsed -i 's###g' input.xmlsed -i 's###g' input.xmlsed -i 's###g' input.xmlsed -i 's###2' input.xml#在文件头插入格式化字符串sed -i '1i\' input.xmlsed -i '2i\' input.xml#文件末尾加入特定字符串sed -i '$a\' input.xml

4、小结

shell对文本的处理真的非常强大。一些命令行还不能“信手拈来”,有待进一步掌握提高!

20170222 22:36 于家中床前

作者:铭毅天下

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:“面子”真的那么重要吗?——2017过年返乡见闻与思考
下一篇:Elasticsearch实战——全文检索架构设计
相关文章

 发表评论

暂时没有评论,来抢沙发吧~