判断输入
if [ $# -ne 1 ]; then
echo $0 DATAFILE
echo
exit 2
fi
输入参数不为1显示该信息
处理文本内容
处理文本,利用awk处理文本,如文本的一条数据是:
数据中的分隔符是(char)3分隔符,属于不能打印的分隔符,当然替换成其他简单的打印字符也可以
201508,1000,ADFF1324252,1,1,0,1,1,242.0,2424.0,我最伟大,546.0,6868.0,B9999FA8226,2.3,39.3
query=`echo $line | awk 'BEGIN{FS="\03"}{
printf("'\''%s'\'','\''%s'\'','\''%s'\'','\''", $1, $2, $3);
if ($4 == "1") {
printf("123456\&'\''\|\|'\''我最伟大\&'\''\|\|'\''%s\|",$9)
};
if ($5 == "1") {
printf("234567\&'\''\|\|'\''我最渺小\&'\''\|\|'\''%s\|",$10)
};
if ($6 == "1") {
printf("345678\&'\''\|\|'\''我最厉害\&'\''\|\|'\''%s\|",$11)
};
if ($7 == "1") {
printf("456789\&'\''\|\|'\''我最牛逼\&'\''\|\|'\''%s\|",$12)
};
if ($8 == "1") {
printf("567890\&'\''\|\|'\''我最无语\&'\''\|\|'\''%s\|",$13)
};
printf("'\'','\''%s'\'','\''%s'\'','\''%s'\''", $14, $15, $16)}'`
statement=`echo "INSERT INTO $TABLE(MONTH,CODE,ID,INFO,R_ID,TUDE,ITUDE) VALUES($query);"`
echo $statement >>sql.txt
这里,首先用awk格式化输出特定字符,这里只取1,2,3和45678中不为0的数值,和14,15,16这几个值。
格式化输出之后用query接收,并将其组成sql语句,保存到sql.txt中。
在awk处理过程中,用BEGIN{FS="\03"}来指定分隔符为(char)3分隔符,如果是逗号,可以直接指定FS=","或者利用awk -F ','也可。
在组成insert的sql语句过程中,单引号需要转义,利用'\''进行转义,即单引号、斜杠、单引号、单引号。
地址符号&在插入数据库的过程中会保存,需要用\&'\''\|\|'\'',其中的'都是单引号。构成&'||'这种形式。
连接数据库
连接Oracle数据库当然用用sqlplus
sqlplus test/test@XX.XX.XX.XX:1521/db<<EOF
XX.XX.XX.XX代表远程数据库的ip地址IP。
插入数据
连接完成数据库,直接
@sql.txt 即可插入数据
然后commit;
完整代码
#!/bin/sh
#
# @test.sh
# @文件数据导入oracle
# @version 1.0
TABLE="T_RECO"
if [ $# -ne 1 ]; then
echo $0 DATAFILE
echo
exit 2
fi
data=$1
while read line;
do
query=`echo $line | awk 'BEGIN{FS="\03"}{
printf("'\''%s'\'','\''%s'\'','\''%s'\'','\''", $1, $2, $3);
if ($4 == "1") {
printf("123456\&'\''\|\|'\''我最伟大\&'\''\|\|'\''%s\|",$9)
};
if ($5 == "1") {
printf("234567\&'\''\|\|'\''我最渺小\&'\''\|\|'\''%s\|",$10)
};
if ($6 == "1") {
printf("345678\&'\''\|\|'\''我最厉害\&'\''\|\|'\''%s\|",$11)
};
if ($7 == "1") {
printf("456789\&'\''\|\|'\''我最牛逼\&'\''\|\|'\''%s\|",$12)
};
if ($8 == "1") {
printf("567890\&'\''\|\|'\''我最无语\&'\''\|\|'\''%s\|",$13)
};
printf("'\'','\''%s'\'','\''%s'\'','\''%s'\''", $14, $15, $16)}'`
statement=`echo "INSERT INTO $TABLE(MONTH,CODE,ID,INFO,R_ID,TUDE,ITUDE) VALUES($query);"`
echo $statement >>sql.txt
done < $data
sqlplus test/test@XX.XX.XX.XX:1521/db<<EOF
@sql.txt
commit;
exit
EOF
if [[ $? -eq 0 ]]; then
echo "Wrote data into DB"
fi