注意:路径需要修改。
s3uri_received=文件存放路径
IF_FILE_NAME= 文件名。带“ * ”会匹配指定文件名开头的所有文件。
DL_PATH=中间文件存放路径
TMP_PATH=中间文件存放路径/if_copy_tmp
删除空行
sed -i '/^$/d' ${s3uri_received}${IF_FILE_NAME}*
获取文件size 生成列表到指定文件
stat -c%s ${s3uri_received}${IF_FILE_NAME}* 1> ${TMP_PATH}_FILE_SIZE_LIST_$$ 2>&1
FILE_SIZE_LIST=(`cat ${TMP_PATH}_FILE_SIZE_LIST_$$`)
for FILE_SIZE in ${FILE_SIZE_LIST[@]}; do
if [ ${FILE_SIZE} -eq 0 ]
then
log_error "文件size为0。文件:${s3uri_received}${IF_FILE_NAME}"
exit 1
fi
done
执行sh时可以传入TruncateFlag
# TRUNCATE
if [ ${DEL_FLG} -eq 1 ]
then
# 执行指定sql 输出执行结果到指定文件
psql -h ${URL} -p ${PORT} -U ${USERNAME} -d ${DATABASE_NAME} -v ON_ERROR_STOP=1 -A -q -t -f ../sql/${IF_FILE_NAME}_TRUN.sql 1> ${TMP_PATH}_TRUN_SQL_RESULT_$$ 2>&1
if [ $? -ne 0 ]
then
log_error "TRUNCATE失败。../sql/${IF_FILE_NAME}_TRUN.sql"
exit 1
fi
fi
编码转换
# 例:转换指定文件到utf-8,新文件名带UTF8,如果执行发生错误,输出到指定_ICONV_RESULT_文件中。
iconv -f ${code} -t UTF-8 ${DL_PATH}${IF_FILE}_$$ > ${DL_PATH}${IF_FILE}_UTF8_$$ 2> ${TMP_PATH}_ICONV_RESULT_$$
将copy.sql中的 's/%INPUT_FILE%/' 替换为转换后的文件名,生成结果存放到中间文件中。
cat ../sql/${IF_FILE_NAME}_COPY.sql|sed 's/%INPUT_FILE%/'${IF_FILE}_UTF8_$$'/g' > ${TMP_PATH}_COPY_$$.sql
copy.sql 大概这样。tsv需要加 DELIMITER ' ' (tab),csv不需要。文件路径需要修改。
\copy "public".test_user (
usr_id
, usr_name
, reg_ymdhms
, upd_ymdhms
, upd_id )
FROM 'data/work/%INPUT_FILE%'
WITH
CSV
DELIMITER ' '
FORCE NULL
usr_id
, usr_name
, reg_ymdhms
, upd_ymdhms
, upd_id
ENCODING 'UTF-8' ;
执行sql,将文件导入数据库
psql -h ${URL} -p ${PORT} -U ${USERNAME} -d ${DATABASE_NAME} -v ON_ERROR_STOP=1 -A -q -t -f ${TMP_PATH}_COPY_$$.sql 1> ${TMP_PATH}_COPY_SQL_RESULT_$$ 2>&1