如何无需编辑CSV,使用SQL*Loader加载首列仅分组头部含数据的文件?
自动填充CSV分组编号后用SQL*Loader加载
你可以通过Awk在Shell脚本中自动预处理CSV文件,将每组头部的编号填充到该组后续行的空第一列,无需手动编辑文件。以下是完整实现方案:
1. 核心Awk预处理命令
直接用Awk处理原始CSV,生成符合要求的文件:
awk -F',' 'BEGIN{OFS=","} {if ($1 != "") group=$1; else $1=group; print}' input.csv > processed.csv
命令逻辑说明:
-F',':指定逗号为输入字段分隔符BEGIN{OFS=","}:设置输出分隔符为逗号,确保处理后仍为标准CSV格式- 逐行处理:
- 若当前行第一列非空,将其值存入
group变量(记录当前组编号) - 若第一列为空,将
group的值赋值给第一列 - 打印处理后的整行
- 若当前行第一列非空,将其值存入
2. 完整Shell脚本示例
将预处理和SQL*Loader调用整合到脚本load_employee_data.sh中:
#!/bin/bash # 配置参数(根据实际环境修改) RAW_CSV="employee_raw.csv" PROCESSED_CSV="employee_processed.csv" LOADER_CTL="employee_loader.ctl" DB_USER="scott" DB_PWD="tiger" DB_TNS="orcl" # 预处理CSV,填充分组编号 awk -F',' 'BEGIN{OFS=","} {if ($1 != "") group=$1; else $1=group; print}' "$RAW_CSV" > "$PROCESSED_CSV" # 调用SQL*Loader加载数据 sqlldr userid="$DB_USER/$DB_PWD@$DB_TNS" control="$LOADER_CTL" data="$PROCESSED_CSV" log=load.log bad=load.bad discard=load.dsc
3. SQL*Loader控制文件示例
创建对应的控制文件employee_loader.ctl,适配你的目标表结构:
LOAD DATA INFILE 'employee_processed.csv' INTO TABLE employee_records FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( group_id INTEGER, job_title CHAR(50), hire_date DATE "MM/DD/YYYY", employee_name CHAR(50) )
控制文件说明:
TRAILING NULLCOLS:自动处理行末尾的空字段(比如原始CSV中部分行第三列为空的情况)- 日期格式
"MM/DD/YYYY":匹配CSV中的日期格式,可根据实际调整 - 字段类型和长度:根据目标表的字段定义修改
4. 使用说明
- 将原始CSV文件命名为
employee_raw.csv(或修改脚本中的RAW_CSV参数) - 配置脚本中的数据库连接信息和控制文件路径
- 赋予脚本执行权限:
chmod +x load_employee_data.sh - 运行脚本:
./load_employee_data.sh
内容的提问来源于stack exchange,提问作者Todd
相关产品推荐
相关产品推荐

