shell将数据导出为csv

从一个 MySQL 数据库中导出指定的一系列表到 CSV 文件

#!/bin/bash

# MySQL 连接信息
HOST="xxx.xxx.x.xxx"
DB="xxx"
USER="xxx"
PASS="xxx"
PORT=xxx

# 输出目录
OUTPUT_DIR="mysql_exports"

# 创建输出目录(如果不存在)
mkdir -p "$OUTPUT_DIR"

# 要导出的表列表
TABLES=(
    "user"
    "student"
)

# 遍历表并导出为 CSV
for TABLE in "${TABLES[@]}"
do
    echo "Exporting $TABLE..."
    mysql -h "$HOST" -P "$PORT" -u "$USER" -p"$PASS" "$DB" -e "SELECT * FROM $TABLE" | \
    sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > "$OUTPUT_DIR/$TABLE.csv"
    
    if [ $? -eq 0 ]; then
        echo "Successfully exported $TABLE to $OUTPUT_DIR/$TABLE.csv"
    else
        echo "Failed to export $TABLE"
    fi
done

echo "Export process completed."

这段 Bash 脚本的主要功能是从一个 MySQL 数据库中导出指定的一系列表到 CSV 文件。

#!/bin/bash

指定了该脚本应该使用 /bin/bash 解释器来执行。

MySQL 连接信息

HOST="xxx.xxx.x.xxx"
DB="xxx"
USER="xxx"
PASS="xxx"
PORT=xxx

这些变量定义了连接到 MySQL 数据库所需的参数:

  • HOST: 数据库服务器的 IP 地址。
  • DB: 要操作的数据库名称。
  • USER: 连接到数据库的用户名。
  • PASS: 用户的密码。
  • PORT: 数据库监听的端口。

输出目录

OUTPUT_DIR="mysql_exports"

定义了导出文件将要保存的目录名。

创建输出目录

mkdir -p "$OUTPUT_DIR"

这条命令确保输出目录存在。如果目录不存在,则会创建它;如果已经存在,则不会报错。

要导出的表列表

TABLES=(
    "user"
    "student"
)

这是一个数组,包含了所有需要从数据库中导出的表的名字。

导出表为 CSV

for TABLE in "${TABLES[@]}"
do
    echo "Exporting $TABLE..."
    mysql -h "$HOST" -P "$PORT" -u "$USER" -p"$PASS" "$DB" -e "SELECT * FROM $TABLE" | \
    sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > "$OUTPUT_DIR/$TABLE.csv"
    
    if [ $? -eq 0 ]; then
        echo "Successfully exported $TABLE to $OUTPUT_DIR/$TABLE.csv"
    else
        echo "Failed to export $TABLE"
    fi
done

这部分是一个 for 循环,遍历 TABLES 数组中的每个表,并执行以下操作:

  1. 打印消息:告知用户正在导出哪个表。
  2. 执行 SQL 查询:使用 mysql 命令行工具连接到数据库并执行 SELECT * FROM $TABLE 查询,获取表中所有的数据。
  3. 格式化输出:使用 sed 命令对输出进行处理,将其转换成 CSV 格式。具体来说:
    • s/\t/","/g 将制表符替换为逗号和双引号(CSV 的字段分隔符)。
    • s/^/"/ 在每行的开始添加一个双引号。
    • s/$/"/ 在每行的末尾添加一个双引号。
    • s/\n//g 移除行尾的换行符(这个部分可能不是必要的,取决于实际的输出格式)。
  4. 重定向输出:将格式化后的数据写入到 $OUTPUT_DIR/$TABLE.csv 文件中。
  5. 检查状态:使用 $? 获取上一条命令的退出状态码。如果状态码为 0,表示命令成功执行,否则表示有错误发生。
  6. 打印结果:根据命令是否成功执行,打印相应的成功或失败消息。

为什么使用 ${TABLES[@]}

  1. 遍历所有元素

    • ${TABLES[@]} 会将数组 TABLES 中的所有元素作为一个列表返回,这样可以在 for 循环中逐个处理每个元素。
    • 例如,如果有一个数组 TABLES=("user" "student"),使用 for TABLE in "${TABLES[@]}" 会依次将 user 和 student 赋值给变量 TABLE
  2. 保留空格和特殊字符

    • 使用 ${TABLES[@]} 可以确保数组中的每个元素都被正确处理,即使元素中包含空格或其他特殊字符。
    • 如果不使用 [@],而是直接使用 $TABLES,则只会返回数组的第一个元素,或者将整个数组作为一个字符串返回,这可能会导致意外的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值