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个双引号,避免对包围符造成干扰。