平时经常要从数据库中导出大量数据,以便在 Excel 或者 WPS 表格中进行分析和处理。 之前一直是用 Excel 格式导出数据,最近尝试用 CSV 格式导出,发现稍微复杂一点的数据,CSV 格式就会出现各种问题 😅。
所以最后放弃使用 mysqldump 直接导出 CSV 文件,还是用 golang 代码生成 Excel 文件,虽然代码复杂了一点,但是导出的数据在 Excel 或 WPS 表格中打开时,没有任何问题。这里记录一下两种文件格式的区别:
CSV 是什么?
CSV(Comma-Separated Values,逗号分隔的数据)是一种简单的文本文件格式,用于存储表格数据。每一行代表一条记录,字段之间使用逗号分隔。CSV 文件可以被多种应用程序(如电子表格软件、数据库管理系统等)读取和写入,因其简单性和广泛兼容性而被广泛使用。数据格式示例:
name,age,email,tel
Alice,30,alice@example.com,1234567890
Bob,25,bob@example.com,0987654321
编码问题
CSV 文件通常使用单一编码格式(如 UTF-8 或 ASCII),其实就是一个 txt 文本文件。记事本就能打开浏览。
非常诡异的是,Excel 在打开 CSV 文件时,会默认使用系统区域设置的编码格式,而非文件的编码格式,于是导致非 ASCII 字符显示异常。 即便你的 CSV 文件是用的 UTF-8 编码格式保存的,打开时也会出现乱码。
参考 Stack Overflow 上的讨论:
https://stackoverflow.com/questions/10295228/exporting-results-of-a-mysql-query-to-excel
Surprisingly, it wasn't until Excel was 31 years old (Excel 2016) when Excel added built-in support for UTF-8 encoding in files without needing a BOM, but it still defaults to importing and exporting CSV files using your system-default non-Unicode encoding (e.g. Windows-1252).
除非你使用 Excel 的 CSV 导入向导,手动指定文件的编码格式,否则很难正确打开 UTF-8 编码格式的 CSV 文件。
特殊字符的转义问题
- Excel 文件格式能够正确处理和转义特殊字符(如逗号、引号、换行符等),确保数据的完整性和准确性。
- CSV 文件在处理特殊字符时,可能需要额外的转义规则,否则会导致数据解析错误。
例如,CSV 文件中的逗号会被误认为是字段分隔符,导致数据错位。 如果使用双引号将包含逗号的字段括起来,可以避免这个问题,但是一旦字段中出现双引号。 双引号的处理方式也需要额外的转义规则(如使用两个连续的双引号表示一个双引号)。
而 MySQL 默认的默认处理规则是将双引号前加上反斜杠进行转义,这与 Excel 或者 WPS 表格的默认处理规则不一致,导致导出的 CSV 文件在 Excel 或 WPS 表格中打开时,出现字段错位的问题。
虽然能通过统一转义的方式来解决,但是增加这种心智负担没有意义。
首行标题缺失
使用 mysqldump 导出 CSV 文件时,默认情况下不会包含首行标题(列名),这会给数据的理解和使用带来不便。 每次都需要我手动添加首行标题,很是繁琐,这是我最不能接受的一个问题。
文件体积的差异
你可以把每一个 .xlsx 格式的 Excel 文件想象成一个经过压缩的“文件夹”。它实际上是一个 ZIP 文件,里面包含了多个文件和文件夹,用于存储电子表格的各种信息,如数据、样式、图表等。
而 CSV 文件则是一个纯文本文件,只有数据,没有进行任何的压缩。
在数据量大时,例如 50 万行数据的情况下,.xlsx 格式的 Excel 文件体积会比 CSV 文件小得多,因为它经过了压缩处理:
- Excel 文件 35M
- CSV 文件 87M
理解成本
对于公司内的非技术人员,很多人连 CSV 格式都没有见过,也有理解成本(根本不知道用什么软件打开)。还不如直接用 Excel 省心。
关于作者 🌱
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式