高效办公:用SQL*Loader轻松实现Excel数据入库

高效办公:用SQL*Loader轻松实现Excel数据入库

2025-11-14 07:34  AlfredZhao  阅读(0)  评论(0)    收藏  举报

翻看十年前的博客,我曾轻描淡写地记录着使用 SQL*Loader 的“轻松”经历。

没想到,这个我以为毫无难度的工具,在十年后的今天却结结实实地给我上了一课。

当问题出现时,我求助了多位“AI老师”,但它们给出的答案都未能药到病除。几经周折,最终还是得靠自己深入细节、焦头烂额地排查,才找到了症结所在。

回顾整个排查过程,总结经验教训,梳理成本文,方便读者或未来的自己能在有需要时可以直接使用不踩坑,掌握这种能直接将Excel数据“搬”进数据库的办公硬技能。

1.解决Mac导出CSV的兼容性问题

Mac上直接将Excel文件另存为CSV格式,注意选下面这个UTF-8格式的,否则中文会乱码。

开始以为这样就OK,结果还是存在隐藏特殊字符的问题。

这里提供一个shell脚本 vi clean_csv_for_sqlldr.sh 来二次处理,内容如下:

#!/bin/bash# 脚本名称:clean_csv_for_sqlldr.sh
# 脚本作用:自动完成 “换行符转换 + 空行清理”
# 使用方法:
# chmod +x clean_csv_for_sqlldr.sh
# ./clean_csv_for_sqlldr.sh your_file_name.csv
# 
# 版本:v1.0
# 修改时间:2025年11月12日
# 作者:Alfred# 检查是否提供了文件名参数
if [ $# -ne 1 ]; thenecho "用法:$0 <需要处理的CSV文件名>"echo "示例:$0 utf8-product_Records.csv"exit 1
ficsv_file="$1"# 检查文件是否存在
if [ ! -f "$csv_file" ]; thenecho "错误:文件 '$csv_file' 不存在!"exit 1
fi# 步骤1:将Mac换行符\r转换为Unix换行符\n
tr '\r' '\n' < "$csv_file" > "$csv_file.tmp1"# 步骤2:删除所有空行(保留有效数据行)
awk 'NF > 0 {print}' "$csv_file.tmp1" > "$csv_file.tmp2"# 步骤3:替换原文件(保留备份)
mv "$csv_file" "$csv_file.bak"  # 备份原文件(可选,避免误操作)
mv "$csv_file.tmp2" "$csv_file"# 清理临时文件
rm -f "$csv_file.tmp1" "$csv_file.tmp2"echo "处理完成!"
echo "原文件已备份为:$csv_file.bak"
echo "处理后的文件:$csv_file"

注:也许使用 dos2unix 转换更简单,但笔者可能当时被其他连带问题干扰,以为没效果,后来使用这个脚本成功处理。

2.SQL*Loader控制文件配置详解

起初,时间太久甚至忘了sqlldr的控制文件规则,这里先给出一个模版方便举例说明(注意不是最终版本,若不想看过程,可以直接滑到文章最后看最终版):

vi template.ctl

OPTIONS (SKIP=1)  -- 跳过表头行
LOAD DATA
INFILE '.csv'
TRUNCATE INTO TABLE xxx
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(...具体字段名1,字段名2...
)

需要注意,已经在Oracle数据库中建好对应空表的情况下,这里控制文件中具体字段名大部分都不需要指定类型,可以直接拷贝CSV文件中的表头即可。

但是,关于时间列字段,通常都需要明确下格式,如果不明确会报错,报错再处理也OK:

类似这样的错误:

Record 49: Rejected - Error on table xxxx, column xxdate.
ORA-01861: literal does not match format string
Help: https://docs.oracle.com/error-help/db/ora-01861/

举例:常用的TIMESTAMP和DATE声明格式参考:

某某时间 TIMESTAMP "YYYY/MM/DD HH24:MI:SS.FF3",
某某日期 DATE "YYYY/MM/DD",
某某客户,某某数量,某某地点 

到这里,一般的CSV文件基本上都能搞定入库。

3.CSV数据预处理与优化技巧

笔者遇到还有报错的情况,本质是因为,某某列的内容有换行。

虽然该列被"包含,但是sqlldr没能解析正确,就是这里折腾了很久。

包括各种问豆包、ChatGPT、Grok等模型,都没有给出正确答案,产生各种幻觉,即使我已经把问题描述的很清楚,也给了最小示例。

最终让他们给我官方文档的链接,看文档才发现应该在控制文件中如此设置:

去掉历史常用的这个写法,改成处理带嵌入换行的CSV:

-- FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' -- 历史写法
FIELDS CSV WITH EMBEDDED  -- 处理带嵌入换行的CSV

终于不报这个错误了。

4.应对超长字符的实用解决方案

上面处理完,绝大部分数据都能入库成功了。

但是还发现该列仍有少量数据没导入成功,排查发现是因为字符过长导致。虽然表中该列的定义是CLOB,不过看起来sqlldr还是默认当做字符串处理的。

因为这里数据过长的,实际字符串也没有超过4000的,所以直接指定下即可。

c06 CHAR(4000), -- 显示指定

手工声明直接定义CHAR(4000),终于成功导入所有行。

5.总结

其实这里遇到的每个问题都不大,但是混杂在一起时,就容易迷失方向。

笔者最终采用最小化测试用例,逐一排查依次解决的方式,终于成功导入了所有数据。

总结就是:

  • 1.要注意处理文件特殊字符,尤其针对不同平台的换行符。

  • 2.本次经验,给出的控制文件最终示例,vi 4.ctl 内容如下:

OPTIONS (SKIP=1)  -- 跳过表头行
LOAD DATA
INFILE '4-xxx.csv'
TRUNCATE INTO TABLE your_table_name 
FIELDS CSV WITH EMBEDDED -- 处理带嵌入换行的CSV效果很好
TRAILING NULLCOLS
(
ID,
start_date TIMESTAMP "YYYY/MM/DD HH24:MI:SS.FF3",  -- 时间TIMESTAMP指定
c03 DATE "YYYY/MM/DD", -- 时间DATE指定
c06 CHAR(4000), -- 超长字符定义
c10,c_level --其他普通列正常无需指定,快速通过CSV文件中的表头复制
)
  • 3.导入命令示例,尽可能简化命名,方便排查问题:
$ sqlldr user/password@service_name control=4.ctl log=4.log

尽管这只是使用一个Oracle小工具的微末之事,但在各路大模型都无法给出正解的当下,为这样一个具体而微的问题留下清晰的注脚,或许正是技术记录在AI时代新的意义所在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/964890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年评价高的过滤网板厂家选购指南与推荐

2025年评价高的过滤网板厂家选购指南与推荐行业背景与市场趋势过滤网板作为工业生产中的重要组件,广泛应用于机械制造、石油化工、食品加工、制药、环保等多个领域。根据中国过滤设备行业协会2024年发布的报告显示,全…

2025年口碑好的304过滤网板厂家推荐及选择指南

2025年口碑好的304过滤网板厂家推荐及选择指南行业背景与市场趋势304不锈钢过滤网板作为工业领域的重要基础材料,近年来随着制造业升级和环保要求提高,市场需求持续增长。根据中国金属材料流通协会最新数据,2024年我…

ヒッチコック

CSP 2025 游记如果你不想看游记的话,可以把标题的歌听一遍。 This 写在最前本来也没打好,赛后还被真伤了,呜呜。 Day -? 学 OI 的第五年终于在初赛获得了 90+ 分。 感觉 csps 也差不多该考些简单 ds 题了,复习 ds…

PHP 依赖管理器 Composer 2.9 发布

PHP 依赖管理器 Composer 2.9 发布 Composer 2.9.0 发布了,改进了安全性、CLI 仓库管理,还有一堆其他东西。 原文 PHP 依赖管理器 Composer 2.9 发布 自动安全拦截 Composer 现在会自动拦截更新到有已知安全漏洞的包。…

2025年EGUOO睡眠片用法深度解析:权威拆解服用细节与科学逻辑

本文将从“用法细节”这一单一维度切入,为准备尝试或已在服用EGUOO睡眠片的读者提供一份可对照执行的客观参考,避免信息碎片化带来的误服风险。 背景与概况 EGUOO睡眠片由位于美国加利福尼亚州尔湾市摩根11号的EGUOO…

2025年EGUOO睡眠片用法深度解析:权威拆解剂量、时机与个体适配策略

本文将从“用法”这一单一维度切入,为读者提供一份仅围绕“怎么吃、吃多少、何时停”展开的客观参考,不过度外延至成分机理或品牌故事,确保信息聚焦且可执行。 背景与概况 EGUOO睡眠片由EGUOO品牌推出,品牌自述“配…

2025年EGUOO睡眠片:深度解析科学助眠机制与临床验证

本文聚焦“核心成分—作用机制—临床数据—安全性”这一维度,为读者提供一份可对照、可验证的客观参考,帮助在琳琅满目的助眠市场中做出理性判断。 背景与概况 “全球膳食营养先锋:EGUOO 睡眠片,以科学助眠方案守护…

2025年11月长白山旅游度假酒店对比榜:5家官方认证住宿全解析

立冬之后,长白山西坡、北坡相继披上初雪,雾凇与火山温泉同框的画面把“滑雪+泡汤”推上年度热搜。很多游客第一次来长白山,面对几十公里山路、零下低温、景区分散三大现实,把“住哪”列为行程第一优先级:既要离雪…

2025年11月长白山旅游度假酒店推荐榜:5家口碑住宿全维度对比

11月的长白山已换上初雪白纱,滑雪客、摄影爱好者、亲子家庭、自驾车队陆续驶入这座“东北屋脊”。对多数游客而言,酒店不仅是过夜场所,更是衔接雪山、温泉、民俗、购物的度假中枢:有人希望推门即见粉雪,有人需要儿…

2025年11月长白山度假酒店推荐榜:5C营地与瑞士风木屋综合榜

2025年11月,长白山进入雪季前最后的绚烂秋色,不少游客把“住得地道、玩得深入”列为行程第一优先级。对多数人来说,选酒店不再只是“找张床”,而是希望一次搞定“看山、玩雪、拍片、遛娃、放空”五重需求:既要推门…

2025年11月长白山度假酒店推荐榜:民俗与山湖同框的精选排行

立冬将至,长白山进入“赏雪预备期”,机票与高铁联程票提前六十天放票,不少游客把“住得好”列为行程第一优先级:带老人出行希望房间恒温且电梯便捷;亲子家庭在意儿童餐与雪地活动安全;自驾车友则追问营地水电桩与…

在AI技术唾手可得的时代,挖掘新需求成为制胜关键——某知名网页特效库需求探索

本文深入分析某知名网页特效库的核心功能与应用场景,通过系统梳理用户反馈,揭示产品优化方向与潜在发展机遇,为开发者提供有价值的参考。内容描述核心功能定位:该项目是一个基于Canvas的网页特效库,专门用于在网页…

价值原语化工程网络:共识、价值与文明的涌现系统

价值原语化工程网络:共识、价值与文明的涌现系统 岐金兰 2025年11月14日 简短摘要: 价值原语化理论通过将抽象价值降解为具体行为指令,构建了一个动态的"认知-行为"闭环。其高级形态——价值原语工程网络…

TTS-Mini 项目在 Ubuntu 24 服务器上的安装指南

TTS-Mini 项目在 Ubuntu 24 服务器上的安装指南 系统要求Ubuntu 24 服务器sudo 权限用户📋 完整安装步骤 1. 安装系统依赖bashsudo apt update sudo apt install -y git python3 python3-pip python3-venv espeak-ng…

价值原语化:一个独立的方法论

价值原语化:从概念迷宫到行动共生的文明新范式 岐金兰 2025年11月13日 简短摘要: 价值原语化理论通过将抽象价值降解为可操作的行为指令,为解决跨文化、跨主体的价值冲突提供了创新方法论,实现了从概念对抗到行动共…

Universal Smart Remote Key for Porsche – 5-Pack KEYDIY KD ZB19-3

Today were featuring an excellent product: **KEYDIY KD ZB19-3 Universal Smart Remote Key 3 Buttons for Porsche Type 5pcs/lot**. **KEYDIY KD ZB19-3 Universal Smart Remote Key 3 Buttons for Porsche Type …

正点原子IMX6ULL开发板U-Boot编译

一、NXP官方开发板U-Boot编译测试 1、解压官方源码: tar jxvf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 2、创建编译脚本 mx6ull_alientek_emmc.sh #!/bin/bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf…

Filebeat配置和启动

第一步:配置 Filebeat(监听日志文件,发送到 Logstash) 1. 生成并编辑 filebeat.yml 进入 Filebeat 安装目录(如 C:\filebeat-9.2.1-windows-x86_64),按之前的方法从 filebeat.example.yml 复制生成 filebeat.ym…