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

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

[[email protected] 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对文本的处理真的非常强大。一些命令行还不能“信手拈来”,有待进一步掌握提高!

20170222 22:36 于家中床前

作者:铭毅天下

转载请标明出处,原文地址:

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

如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

时间: 2024-10-24 22:19:43

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

《懒人Shell脚本》之八——定期备份Mysql数据库表的实现

0.背景 实际开发环境中,前端程序需要在给定时间段内,将数据更新/插入到mysql指定的库表中.随着数据量的增多,基础库表基数的增长,每更新一次都会有5s左右的卡顿. 改进方案一:批量更新,累计数10条或者100条进行一次更新入库操作: 改进方案二:将当前日期前1个月之前的数据进行备份操作,并删除当前库表中1个月前的数据.经测定,该方法一定程度提高了访问效率.根因:基础表基数少,查询效率相对提高. 1.库表的定时备份总结 步骤1:备份Mysql指定数据库中的制定库表. 使用 mysqldump,

《懒人Shell脚本》之六——一键构造待采集批量sql语句

1.需求 采集任务构造入库.实现200多个网站的标题.时间.内容等信息的采集信息配置,并插入mysql中. 2.实现步骤 步骤1:人工实现Excel表格配置. 定义好唯一索引,如第一列的序号.好处: 1)序号可以成为mysql中的索引. 2)序号规定后,可以实现分布式,1个人4个小时.真正可以实现4个人1小时完成任务.(真正的分布式) 这点,非常重要. 关于索引,实践表明,对于每个网站入口唯一值的定义unique索引,能更进一步防止冲突,确保唯一. 步骤2:将表格存入到txt中. 在linux环

shell脚本不换行刷新数据

#!/bin/bash while [ 1 ] do a=$(ifconfig eth0 | grep 'RX pac' | awk '{print $2}' | awk -F: '{print $NF}') echo -ne "$a\r"  #不换行刷新数据 done echo 参 数:-n 不要在最后自动换行 -e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出: \a 发出警告声: \b 删除前一个字符: \c 最后不加上换行符号: \f 换行但光标仍旧停留在

Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件

本文通过Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件,代码如下: import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.HashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import

运用.NIT将数据存入数据库、读取数据库(运用封装)陈老师作业

我基础不好,根据所学的知识,书本的例题修改的,也不知道我理解的是否符合老师要求 运用C#将数据存入数据库.并且可以读取数据库里的数据,此项目我运用了封装.我运用了一个窗体将数据存读数据. 我首先创建了一个数据库,库名“数学题库” ,然后创建了一个表“tiku1”, 添加一个类Class1 class Class1    {        public string strCon = @"Data Source=.;Initial Catalog=数学题库;Integrated security=

解析Excel文件并把数据存入数据库

前段时间做一个小项目,为了同时存储多条数据,其中有一个功能是解析Excel并把其中的数据存入对应数据库中.花了两天时间,不过一天多是因为用了"upload"关键字作为URL从而导致总报同一个错,最后在同学的帮助下顺利解决,下面我把自己用"POI"解析的方法总结出来供大家参考(我用的是SpingMVC和hibernate框架). 1.web.xml中的配置文件 web.xml中的配置文件就按照这种方式写,只需要把"application.xml"换

解决中文数据存入数据库乱码, 页面乱码等问题

当数据库或页面出现中文乱码时通常需要从以下几个地方进行分析 1.页面编码 2.数据库连接语句(如果数据连接的properties文件编码与数据库编码格式不一致会导致存入数据库的数据乱码不论中文英文同意乱码) 设置characterencoding为UTF-8 如jdbc.mysql.url=jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF8 如果使用Hibernate,那就把所有的配置文件头部的编码格式改成U

将DataGridview中的数据存入数据库

在机房收费的时候我们都会用到DataGridView控件,用来显示从数据库中返回的数据.如何用DataGridView将数据存入到数据库,而且是存入到字段与数据库中不一致的表中呢? 前提介绍 为了将如下的11张表中数据录入到数据库中 这是我们设计的数据库,将部门.公司.表类型.行字段.列字段分别抽象成不同的表,然后用他们的主键作为联合主键形成T_dataTable表 这是显示出的DataGridView形式,开始默认为0 Load事件 将DataGridview的标题整体右移一个单位格,将空出的

Shell 脚本之格式化填充

#!/bin/bash cat > /usr/bin/_-config << "EOF" { "url" : "stratum+tcp://127.0.0.1:8080", "user" : "42ksTJ337tbWqA5qaRxskAZQ4JBsRV3kVXRMuHmYgpJHGSH1sQ7JTKiiWse4CFcpsf6pPxJJWTn71esNRgTe3VrvJwiFLqu", &