南大通用GBase 8a导出加载数据时,字段内容包含换行\n怎么处理

GBase 8a数据库集群,支持导出时指定行分隔符和列分隔符,如果数据中的字符和其冲突,可以考虑用多个字符做分隔符,当然也可以用不常见或冲突几率低的不可见字符做分隔符。

如果原始数据有包围符

可以通过having LINES SEPARATOR参数来加载。完整语法可以参考 GBase 8a 集群加载数据LOAD的方法

数据

[root@gbase_rh7_001 gbase]# cat t2_2.txt
99,'ABCD
EFG','2021-07-07'
100,'1234
5678','2021-07-07'
[root@gbase_rh7_001 gbase]#

加载效果

注意指定date_format 以及后面的enclosed by参数。

gbase> load data infile 'sftp://gbase:gbase1234@10.0.2.101/home/gbase/t2_2.txt' into table t2 data_format 3 having LINES SEPARATOR fields terminated by ',' enclosed by ''''  autofill;
Query OK, 2 rows affected (Elapsed: 00:00:01.41)
Task 9253 finished, Loaded 2 records, Skipped 0 records

gbase> select * from t2;
+------+-----------+------------+---------+----------+
| id   | name      | birthday   | commons | loadtime |
+------+-----------+------------+---------+----------+
|  100 | 1234
5678 | 2021-07-07 | NULL    | NULL     |
|   99 | ABCD
EFG  | 2021-07-07 | NULL    | NULL     |
+------+-----------+------------+---------+----------+
2 rows in set (Elapsed: 00:00:00.02)

行分隔符

默认的行分隔符是换行'\n'

lines terminated by '\n'

其支持指定多个,比如用 '\n\n' ,‘ABC\n' 多个字符代表行分隔符,或者1到多个不可见字符 \xFF。

关于不可见字符的使用,请参考 GBase 8a导出和加载使用多个不可见字符做分隔符

加载样例

表结构

四个列的varchar(10)的字段,用来测试数据中带换行符的。

gbase> create table t2(v1 varchar(10),v2 varchar(10),v3 varchar(10),v4 varchar(10));
Query OK, 0 rows affected (Elapsed: 00:00:01.48)

数据

包含两行,用逗号做字段分隔符,数据中包含换行符,最多只有一个。用两个换行作为行分隔符

[gbase@rh6-1 ~]$ cat t2.txt
AA,B
B,CC,DD

AAA,BBB
B,CC
CC,DD
DD

加载

正常加载入库,指定2个换行作为行分隔符。

gbase> load data infile 'sftp://gbase:gbase1234@10.0.2.201/home/gbase/t2.txt' into table t2 fields terminated by ',' lines terminated by '\n\n';
Query OK, 2 rows affected (Elapsed: 00:00:06.80)
Task 336744 finished, Loaded 2 records, Skipped 0 records

查询

查询结果和预期相符。

gbase> select * from t2 \G
*************************** 1. row ***************************
v1: AAA
v2: BBB
B
v3: CC
CC
v4: DD
DD
*************************** 2. row ***************************
v1: AA
v2: B
B
v3: CC
v4: DD
2 rows in set (Elapsed: 00:00:00.40)

另一个例子

用ZTE\n做行分隔符

[gbase@rh6-1 ~]$ cat t2.txt
AA,B
B,CC,DDZTE
AAA,BBB
B,CC
CC,DD
DDZTE
[gbase@rh6-1 ~]$ gccli testdb

GBase client 8.6.2.43-R28.122445. Copyright (c) 2004-2020, GBase.  All Rights Reserved.

gbase> truncate table t2;
Query OK, 2 rows affected (Elapsed: 00:00:01.40)

gbase> load data infile 'sftp://gbase:gbase1234@10.0.2.201/home/gbase/t2.txt' into table t2 fields terminated by ',' lines terminated by 'ZTE\n';
Query OK, 2 rows affected (Elapsed: 00:00:16.80)
Task 338893 finished, Loaded 2 records, Skipped 0 records

gbase> select * from t2 \G
*************************** 1. row ***************************
v1: AA
v2: B
B
v3: CC
v4: DD
*************************** 2. row ***************************
v1: AAA
v2: BBB
B
v3: CC
CC
v4: DD
DD
2 rows in set (Elapsed: 00:00:00.10)

导出样例

参数是一致的。

gbase> select * from t2 into outfile '/home/gbase/t2_out.txt' fields terminated by ','  ESCAPED BY '' lines terminated by 'ZTE\n';
Query OK, 2 rows affected (Elapsed: 00:00:00.14)

gbase> system cat /home/gbase/t2_out.txt
AA,B
B,CC,DDZTE
AAA,BBB
B,CC
CC,DD
DDZTE
gbase>

总结

这里只是演示行分隔符可以用多个字符,不单单非得用\n\n, 可以用任意的组合,比如 ’ZTE\n' 用三个字母加换行符做行分隔符,或者按全面参考的文章,不可见字符做分隔符。

导出和导入的参数是对应的。