dumpling导出数据到csv解析longtext字段不符合预期

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】

  • tidb : 7.5.4

  • dumpling 7.5.4
    【复现路径】做过哪些操作出现的问题

  • 表结构如下
    image

  • 插入数据

create table t1(id int primary key,username  varchar(20),testcol longtext);
insert into t1 values(1,'aaa','{"a1":"A1","b1":"B1","c1":"","d1":"{\\\"e1\\\":\\\"E1\\\"}"}');

  • 使用 dumpling导出
.tiup/components/dumpling/v7.5.4/dumpling  -h 10.xxxx   -u  testuser                 -p 'xxxxxxxx'    -o /home/0106 --filetype csv --sql 'select * from `db0106`.`t1` ;'        --consistency "none"

【遇到的问题:问题现象及影响】

问题:打开后的testcol字段的值分成了好几段,并不是完整的一段 ,值中的a1左侧的双引号也丢失了

【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

1 个赞

到位啊,不错

编码没问题吗,csv 经常遇到引号的问题。

但是我看你的csv文件没问题啊

看着导出的 CSV 格式没有问题,你文件中有你的分隔符当然不建议啦,另外你不要拿 excel 看啊,那玩意不是处理数据的时候用的 :joy_cat:

感觉csv格式没问题

1 个赞

你这WPS里C列是一列值么?缺失的内容好像很多啊,不止符号,A1的1,B1的1都没有?

内容没有缺失,引号缺失导致wps分割有问题,将一列分成了好几列

主要是导出来之后给业务看的,他们是用excel去看的,其他类型的字段是没什么问题的,目前发现这类情况用excel打开之后分割不太对


用excel打开之后 a1 左边的双引号没有了

csv是给数据库导入用的,你要用excel看,应该直接用mysql工具导出成excel格式,navicat dbeaver 等等都行

那你就应该用 dbeaver 类似工具导出 excel 格式

因为导出到csv一直都是用的dumpling这种方式,之前都是正常的,刚好发现对于这类数据不符合预期,所以来社区问下有无解决办法, :joy: 如果不行就只能换一种方式了。

存文本靠谱点,csv和excel,会出现很多不可预知的转换问题

在使用 Dumpling 导出 CSV 文件时,有几个重要的配置选项需要注意,其中之一是 --fields-terminated-by 参数。这个参数用于指定 CSV 文件中字段之间的分隔符。选择合适的分隔符对于确保数据的正确导出和后续处理至关重要。
对于包含特殊字符的数据,可以选择使用 --fields-terminated-by '\t'(制表符)来确保数据的完整性。
除了 --fields-terminated-by,Dumpling 还提供了其他选项来定制 CSV 文件的格式,例如:

  • --csv-delimiter:用于指定字符型变量的定界符,默认是双引号".
  • --csv-separator:用于指定每个值之间的分隔符,建议使用不常见的字符组合以避免与数据内容冲突。

你可以参考一下官方文档的导出CSV时的选项表
https://docs.pingcap.com/zh/tidb/stable/dumpling-overview#导出为-csv-文件
https://docs.pingcap.com/zh/tidb/stable/dumpling-overview#dumpling-主要选项表

1 个赞

补充:

  • 如果 CSV 文件遵循严格格式(每个字段仅占用一行),可以启用 strict-format 设置以允许 Dumpling 将文件分割为多个 256 MiB 大小的块以进行并行处理。这可以通过在配置文件中设置:
[mydumper]
strict-format = true

没实践过,你可以试试这个参数

  • 感谢提供思路,我测了一下,用csv打开的被错误分割的原因是:wps默认的的分隔符用的是逗号, , 所以会将testcol字段中的值按照逗号给分割成了多段。另外, dumpling 似乎没有 --fields-terminated-by 参数

  • 我用以下方式可以达到想要的效果,但是比较繁琐,仅供参考。目前看来没有特别好的解决办法,后续考虑换种方式导出。

操作方法如下:

  1. dumpling导出的时候添加以下三个参数, 将 csv 分隔符变成#
 --csv-delimiter=''    --csv-separator="#"  --escape-backslash=false

导出的csv内容如下:

  1. 将csv文件的后缀改成txt,使用wps打开,会出现导入向导,选择自定义分隔符

image

image

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。