CSV:简单格式下隐藏的那些坑

摘要:本文将盘点处理CSV数据时我遇到的一些坑。

本文分享自华为云社区《CSV—简单格式下隐藏的那些坑》,作者:aKi。

前言

CSV(Comma-Separated Values),是一种通用的、相对简单的文件格式。其文件以纯文本形式存储表格数据,文件可由任意数目的记录组成,记录间以换行符分隔,每条记录由字段组成,字段间的分隔符是特定字符或字符串,最常见的是以逗号作为分隔符。

例如:下面是一个含有三行内容的csv文件。

CSV格式广泛应用于程序之间转移表格数据,这些程序在格式上是不兼容的,在没有高效的数据迁移工具时,CSV就成为最好的中间格式之一,因此大部分程序也都支持CSV数据的导入和导出。例如,从A程序导出CSV文件,再将该文件导入至B程序。这一过程看似简单,但其中也存在着不少隐含的坑,下面我们就来盘点一下常见的三种坑。

坑一:换行和逗号

前文中我们提到过CSV文件中每条记录是通过换行符分隔的,常用逗号作为分隔符。但在实际处理数据时会遇到字段中也存在换行和逗号的情况,如果A程序没有处理好对应的数据,在导入B程序时就会产生错误的数据或记录。

例如:下面CSV文件中第二行的记录中第四个字段中包含逗号和换行。

我们可以使用Excel工具来查看该文件文解析后的样子:

正确的数据处理方式是将包含逗号和换行的字段用双引号包围起来:

对应文件被解析后:

拓展一下,字段中的若本身就存在双引号,需要在字段自身的双引号前再加一个双引号。

比如我们在Airplane前加一个双引号表示字段本身的数据:

该文件使用本文工具打开以后是这样的:

坑二:BOM头

很多时候CSV文件的编码格式都是较为常见UTF-8格式,UTF-8格式存在BOM头的问题,这种问题大部分原因是在Windows下编辑CSV文件时被自动加上了BOM头。如果程序B没有处理好BOM头,会导致将BOM头也被当做字段的一部分,而且这种错误无法通过直接观察CSV文件来发现。

例如这里是两个内容完全相同的文件:

当一个包含BOM头,另一个不包含时,其二进制表达是不一样的:

包含BOM头的文件在文件开始位置多了3个字节数据。处理方式也很简单,将文件以无BOM的形式保存就行。

坑三:CSV注入

CSV注入其实是一个安全漏洞,当CSV文件被Excel工具打开时,其字段数据被Excel解析,从而支持了Excel提供的所有动态功能。

下面我们来看一个例子:

我们将其中一个字段写成了=1+1,此时用Excel工具打开该文件:

=1+1被解析成了2

同理,利用此漏洞还可以执行任意程序。

用Execl打开时会出现如下提示:

点击是后便会运行计算器程序

当然,该漏洞在较新版本的Excel中都被默认禁止了。在文件->选项->信任中心中外部内容设置中默认都是不勾选“启用动态数据交换服务器启动”。

以上就是我在处理csv数据时遇到过的坑,希望读者们在遇到类似问题时能第一时间想到原因和解决方案,避免在坑里徘徊太久。

 

点击关注,第一时间了解华为云新鲜技术~

优秀的个人博客,低调大师

微信关注我们

原文链接:https://my.oschina.net/u/4526289/blog/5783268

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。