Oracle外部表配置'",\n"'为记录分隔符不生效如何解决?
可以使用",\n"作为Oracle外部表的记录分隔符,你配置后无法返回数据通常是以下几个可修复的原因导致:
- 换行符格式不匹配:多数CSV文件在Windows环境下生成时,换行符为
\r\n而非纯\n,你配置的",\n"无法匹配实际的",\r\n"分隔符。可以用十六进制编辑器查看CSV文件的分隔符字节序列,若为0x22 0x2C 0x0D 0x0A 0x22(对应",\r\n"),则分隔符配置改为RECORDS DELIMITED BY '",\r\n"'即可。 - 首尾记录格式不符合规则:你定义的分隔符是两条记录中间的分界序列,需要确保CSV第一条记录的开头为双引号、最后一条记录的末尾不需要额外补
",\n",否则会出现首条记录识别失败、最后一条记录进入坏文件的情况。 - 编码不匹配:如果CSV文件使用了非数据库默认的字符集,特殊字符的字节识别会出错,建议显式指定字符集,示例如下:
ACCESS PARAMETERS ( CHARACTERSET AL32UTF8 RECORDS DELIMITED BY '",\n"' BADFILE SNOW_IMPORT_TEST:'TEST_1.bad' LOGFILE SNOW_IMPORT_TEST:'TEST_1.log' SKIP 1 FIELDS TERMINATED BY '","' MISSING FIELD VALUES ARE NULL )
如果以上调整后还是有问题,可以用预处理方案适配更复杂的CSV格式:通过PREPROCESSOR参数调用脚本提前替换分隔符,避免多字符分隔符的匹配问题,适合字段内含大量换行的场景。示例配置如下:
- 先在对应的目录下创建预处理脚本
csv_handle.sh,授予Oracle用户执行权限,脚本内容为:
#!/bin/bash # 将自定义记录分隔符替换为罕见的不可见字符0x01 sed 's/",\n"/\x01/g' $1
- 修改外部表配置:
ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY "IMPORT_TEST" ACCESS PARAMETERS ( PREPROCESSOR "IMPORT_TEST":'csv_handle.sh' RECORDS DELIMITED BY X'01' BADFILE SNOW_IMPORT_TEST:'TEST_1.bad' LOGFILE SNOW_IMPORT_TEST:'TEST_1.log' SKIP 1 FIELDS TERMINATED BY '","' MISSING FIELD VALUES ARE NULL ) LOCATION ( "IMPORT_TEST":'TEST_1.csv' ) )
内容的提问来源于stack exchange,提问作者Mario Douh
相关产品推荐
相关产品推荐

