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

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

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

相关文章
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
522 60
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
1154 9
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
1199 2
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
1603 1
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
1937 17
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
2658 25
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
544 4
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
846 3

热门文章

最新文章