为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8
【操作系统】:redhat7
【CPU】:
【问题描述】*:
通过dmfldr导出标准的csv文件,不能再通过dmfldr导入回去(如果没有方法解决的话,感觉是设计不合理或者是产品BUG),问题出在字段内包含封闭符时的字段分隔识别问题(oracle sqlldr是可以正确识别的)
导入、导出的csv文件格式如下(下文造数据过程有详细说名):
示例数据:111,"张""三","男 ",2020-01-01 00:00:00,2024-03-06 17:07:29,1,123.45
1.字段分隔符使用,(英文逗号)分隔
2.记录分隔符使用linux换行符
3.字符字段使用"(英文双引号)封闭,非字符字段不封闭
4.字段内如果出现封闭符采用doubled方式处理(即一个引号变成两个引号),看到可以通过escape参数指定转义(产品手册中有提到导出时变成两个字符,再导入时变成一个字符,但目前导入时报错)。
-----------测试过程--------------
--导出表
drop table if exists SRC_GDZQ.test_out;
CREATE TABLE SRC_GDZQ.test_out
(
id integer,
name varchar(300),
sex char(4),
birthdate date,
createtime datetime,
valid bit,
asset numeric(28,8)
);
--插入数据:name字段内包含封闭符(双引号)
insert into SRC_GDZQ.test_out
values(111,'张"三','男','2020-01-01',sysdate,1,123.45)
;
--待导入表(与导出表结构完全一致)
drop table if exists SRC_GDZQ.test_in;
CREATE TABLE SRC_GDZQ.test_in
(
id integer,
name varchar(300),
sex char(4),
birthdate date,
createtime datetime,
valid bit,
asset numeric(28,8)
);
--导出控制文件:核心想要导出标准的csv文件
1.字段分隔符使用,(英文逗号)分隔
2.记录分隔符使用linux换行符
3.字符字段使用"(英文双引号)封闭,非字符字段不封闭
4.字段内如果出现封闭符采用doubled方式处理(即一个引号变成两个引号),看到可以通过escape参数指定转义(产品手册中有提到导出时变成两个字符,再导入时变成一个字符,但目前导入时报错)。
options(
errors=0
lob_file_name='testlob.lob'
log='/home/dmdba/testlog.log'
append_option=1
colname_heading=false
lob_as_varchar=true
lob_as_varchar_size=15
character_code='utf-8'
unrep_char_mode=1
escape='0x22'
db2_mode=true
priority_enclose=true
)
load data
infile '/home/dmdba/testdata.txt' str x '0a'
replace
into table dual
fields terminated by x '2c'
optionally enclose by x '22'
(
id ,
name ,
sex ,
birthdate ,
createtime ,
valid ,
asset
)
--执行导出:成功
/usr/local/dm_client/bin/dmfldr USERID=xxxx/xxxx@xx.xx.xx.xx:5236 MODE='OUT' CONTROL='/home/dmdba/dmtest.ctl' SQL="SELECT * FROM SRC_GDZQ.test_out"
--数据文件:正常达到效果
--再次将该数据文件导回数据库:发生报错
--导入控制文件
options(
errors=0
skip=0
direct=true
index_option=1
commit_option=0
log='/home/dmdba/testlog.log'
lob_as_varchar=true
lob_as_varchar_size=15
character_code='utf-8'
unrep_char_mode=1
escape='0x22'
db2_mode=true
priority_enclose=true
)
load data
infile '/home/dmdba/testdata.txt' str x '0a'
badfile '/home/dmdba/testdata.bad'
replace
into table SRC_GDZQ.test_in
fields terminated by x '2c'
optionally enclose by x '22'
(
id ,
name ,
sex ,
birthdate date format 'YYYY-MM-DD HH24:MI:SS',
createtime date format 'YYYY-MM-DD HH24:MI:SS.FF6',
valid ,
asset
)
--执行导入:导入失败(但是如果将name字段中的双引号去除就正常了)
/usr/local/dm_client/bin/dmfldr USERID=xxxx/xxxx@xx.xx.xx.xx:5236 MODE='IN' CONTROL='/home/dmdba/dmtest_ldr.ctl'
请教大神们是我哪里的配置有问题,还是产品就是这样的特性(oracle sqlldr就能处理这种情况)
我能额外想到的缓解方案:
问题的核心在于字段内出现封闭符的字段界限识别异常,更换一个字段内不会出现的封闭符可以缓解,但不是最根本的产品化解决方法,因为即使封闭符换成不可见字符也不能绝对保证数据中绝对不会出现,尤其是还可能涉及与其他外部应用对接(外部不一定能适配不可见字符的这种格式)。
你这边的数据库是什么版本的呀?
查询版本:
select id_code;