前言
本篇文章简单介绍如何将文本数据使用shell脚本导入MongoDB。
过程如下:
脚本简介
分隔符替换
while read line;
do
str = ${line//' '/''}
str1 = ${str//'!^'/','}
echo str1
done < ${pwd}/$1 > ${pwd_path}/process_file.txt
${str//'!^'/','}
字符替换,将 !^
替换为 ,
;
<
表示从一个文件读内容;
>
表示将内容写进一个文件,如果该文件不存在,会自动新建该文件,因此该操作会覆盖文件之前内容;
>>
同 >
,追加模式,但是该操作不会覆盖之前文件内容。
awk命令
#awk [-F|-f|-v] ‘数据处理’ file
awk -F ',' -vq='"' '
function jsonStr(x,y){printf("%s:%s,"), x , q y q}
function jsonDci(x,y){printf("%s:%.2f,"), x, y}
function jsonEnd(x,y){printf("%s:%s)}, x, y}
{ printf "{"
jsonStr("key", $1);
jsonStr("key2", $2);
jsonDci("key3", $3);
jsonDci("key4", $4);
jsonEnd("key5", $5);
printf "}\n" } ' ${pwd_path}/process_file.txt > ${pwd_path}/process_json.json
该脚本使用awk将数据转为json格式,尝试使用 -F '!^'
做为分割符时,数据处理出现丢失,错误的现象,使用 -F ','
时,数据无误。
本次处理的文本数据分割符为特殊分割符 !^
,因此将分隔符替换为 ,
。
-vq=' " '
设置一个变量 q = "
。
function···
为数据处理过程,格式化为json。
连接MongoDB
#mongo -u -p --host --port port
mongo << EOF
use dbname
db.{txt_name}.drop()
EOF
EOF
之间可以执行mongo的任意操作命令。
此处删除了集合名为 ${txt_name}
的集合(无论该集合是否存在,该操作不会影响脚本执行)。
json数据导入MongoDB
mongoimpot --db dbname --collection ${txt_name} --file ${pwd_path}/process_json.json
mongoimport
将文件数据导入MongoDB,文件可以为json 或 csv 格式,此处使用的是json文件。
删除脚本生成的临时数据文件
rm -rf ${pwd_path}/process_file.txt ${pwd_path}/process_json.json
rm -rf file
强制删除文件file
rm
shell 删除文件(夹)的命令
-rf
该参数表示不询问,强制删除,重要文件删除,不推荐使用该参数。
shell完整代码
#bin/bash
txt_name = ${1%.*}
echo ${txt_name}
pwd_path = `pwd`
#替换拆分符 '!^' 为 ','
while read line;
do
str = ${line//' '/''}
str1 = ${str//'!^'/','}
echo str1
done < ${pwd}/$1 > ${pwd_path}/process_file.txt
#数据转化为json形式
awk -F ',' -vq='"' '
function jsonStr(x,y){printf("%s:%s,"), x , q y q}
function jsonDci(x,y){printf("%s:%.2f,"), x, y}
function jsonEnd(x,y){printf("%s:%s)}, x, y}
{ printf "{"
jsonStr("key", $1);
jsonStr("key2", $2);
jsonDci("key3", $3);
jsonDci("key4", $4);
jsonEnd("key5", $5);
printf "}\n" } ' ${pwd_path}/process_file.txt > ${pwd_path}/process_json.json
#mongo -u -p --host --port port
mongo << EOF
use dbname
db.{txt_name}.drop()
EOF
#json文件导入mongo
mongoimpot --db dbname --collection ${txt_name} --file ${pwd_path}/process_json.json
#删除临时过程数据文件
rm -rf ${pwd_path}/process_file.txt ${pwd_path}/process_json.json
#Finish