0
点赞
收藏
分享

微信扫一扫

使用pg_bulkload工具把csv文件导入数据到翰高数据库 《linux系统》

#!/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


举报

相关推荐

0 条评论