GBase 8a导出CSV格式,数据里包含换行符,双引号的处理方法

GBase 8a可以导出数据到文件,支持自定义导出格式。CSV格式就是逗号分隔的格式,可以用Excel编辑。如果导出CSV数据里包含了换行符,双引号,如不加处理,则在Excel里出现行错位。本文介绍GBase 8a里如何处理该问题。

原始数据

如下3行数据的name字段均包含了换行符。

gbase> select * from t2;
^H+------+---------------+
| id   | name          |
+------+---------------+
|    1 | 123
456
789   |
|    2 | 2
22
222
2222 |
|    3 | 3
33
333
3333 |
+------+---------------+
3 rows in set (Elapsed: 00:00:00.01)

将换行符替换一下看的更明显

gbase> select id,replace(name,'\n','\\n') from t2;
+------+--------------------------+
| id   | replace(name,'\n','\\n') |
+------+--------------------------+
|    1 | 123\n456\n789            |
|    2 | 2\n22\n222\n2222         |
|    3 | 3\n33\n333\n3333         |
+------+--------------------------+
3 rows in set (Elapsed: 00:00:00.02)

默认导出会出现错位

导出

gbase> select * from t2 into outfile '/home/gbase/t2_org.csv' fields terminated by ',' escaped by '' writemode by overwrites;
Query OK, 3 rows affected (Elapsed: 00:00:00.07)

查看数据

[gbase@gbase_rh7_003 t2_org.csv]$ cat t2_org.csv
1,123
456
789
2,2
22
222
2222
3,3
33
333
3333

Excel打开出现错位

导出时指定双引号包围符

指定包围符enclosed by '"',

可以解决错位问题,因为Excel将2个双引号之间的内容判定为1个字段。

gbase> select * from t2 into outfile '/home/gbase/t2.csv' fields terminated by ',' enclosed by '"' escaped by '' writemode by overwrite>
Query OK, 3 rows affected (Elapsed: 00:00:00.05)

查看带包围符的文件

[gbase@gbase_rh7_003 t2.csv]$ cat t2.csv
"1","123
456
789"
"2","2
22
222
2222"
"3","3
33
333
3333"

Excel打开带包围符的没有错位

如果原始数据里存在双引号

将双引号替换成2个双引号

可以用replace手工替换,也可以用DOUBLE_ENCLOSED BY 自动。前者更灵活,后者更方便。

gbase> select * from t2;
+------+---------------+
| id   | name          |
+------+---------------+
|    1 | 123"
456
789  |
|    2 | 2
22
222
2222 |
|    3 | 3
33
333
3333 |
+------+---------------+
3 rows in set (Elapsed: 00:00:00.02)

-- 用replace是一个方法
gbase> select id,replace(name,'"','""')name from t2;
+------+---------------+
| id   | name          |
+------+---------------+
|    1 | 123""
456
789 |
|    2 | 2
22
222
2222 |
|    3 | 3
33
333
3333 |
+------+---------------+
3 rows in set (Elapsed: 00:00:00.02)

-- 用 DOUBLE_ENCLOSED BY '"' 是另一个方法,推荐用这个
gbase> select id,replace(name,'"','""')name  from t2 into outfile '/home/gbase/t2_2.csv' fields terminated by ','  DOUBLE_ENCLOSED BY '"'  enclosed by '"' escaped by '' writemode by overwr>
Query OK, 3 rows affected (Elapsed: 00:00:00.04)

查看效果

[gbase@gbase_rh7_003 t2_2.csv]$ cat t2_2.csv
"1","123""
456
789"
"2","2
22
222
2222"
"3","3
33
333
3333"

总结

通过双引号包围符,将带换行的数据被Excel认定为1个字段。

通过将数据里的双引号替换成2个双引号,避免对包围符造成干扰。