#!/bin/bash
param1=$1 # 输入文件前缀可带上文件路径
param2=$2 # 日志文件
param3=$3 # SKIP_LOG 文件
param4=$4 #要导入表的名称
param5=$5 # 处理的数字范围,如 0-5 这样可以处理多个文件,会自动后缀为000到005
# 定义变量
OUTPUT_TABLE=$param4
PG_PORT="5866" # 端口号
DB_NAME="test" #数据库名称
USER_NAME="highgo" #用户名
LOGFILE=$param2
SKIP_LOG=$param3
DELIMITER="," # 分隔符
NULL_VALUE="\N" # 代表为null
PASSWORD="123" #数据库密码
export PGPASSWORD="$PASSWORD"
# 执行 pg_bulkload 命令
function run_pg_bulkload {
pg_bulkload -i "$1" -O "$OUTPUT_TABLE" -p "$PG_PORT" -d "$DB_NAME" -U "$USER_NAME" \
-o "TYPE=csv" -o "DELIMITER=$DELIMITER" -o "NULL=$NULL_VALUE" \
-o "LOGFILE=$LOGFILE" -o "SKIP=$SKIP_VALUE"
}
# 解析范围参数
IFS='-' read -r start end <<< "$param5"
# 循环处理文件
for ((i=start; i<=end; i++)); do
# 格式化文件名,包含目录和前缀
filename="${param1}$(printf "%03d.csv" "$i")" # 拼接文件名称,前缀+数字,如果param5是0-5 则循环文件名称就是:前缀+000,前缀+001......,
echo "处理文件: $filename"
# 初始化 SKIP 值
SKIP_VALUE=1 # 导入csv文件初始跳过的行数
SKIP_LOG_CONTENT=""
# 循环导入,直到 not_loaded 为 0
while true; do
run_pg_bulkload "$filename" # 传递 SKIP_VALUE
# 从日志文件中提取成功加载的行数
success_loaded=$(grep -oP '\d+(?= Rows successfully loaded)' "$LOGFILE")
# 从日志文件中提取未加载的行数
not_loaded=$(grep -oP '\d+(?= Rows not loaded due to parse errors)' "$LOGFILE")
# 输出未加载的行数
if [ -z "$not_loaded" ]; then
not_loaded=0 # 如果没有未加载的行数,则设为 0
fi
echo "已加载的行数: $success_loaded"
# 清空日志文件
: > "$LOGFILE"
# 如果 not_loaded 为 0,退出循环
if [ "$not_loaded" -eq 0 ]; then
echo "所有行都成功加载!"
break
fi
# 更新 SKIP 值
if [ -n "$success_loaded" ]; then
if [ "$SKIP_VALUE" -eq 1 ]; then
SKIP_VALUE=$((success_loaded + 2)) # 第一次更新
else
SKIP_VALUE=$((SKIP_VALUE + success_loaded + 1)) # 后续更新
fi
SKIP_LOG_CONTENT+="$SKIP_VALUE,"
fi
done
# 一次性将 SKIP_LOG_CONTENT 写入 SKIP_LOG
if [ -n "$SKIP_LOG_CONTENT" ]; then
echo "$filename:$SKIP_LOG_CONTENT" >> "$SKIP_LOG"
fi
done
# 清理环境变量
unset PGPASSWORD