首页 > 其他分享 >CSV:简单格式下隐藏的那些坑

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

时间:2023-01-04 11:44:06浏览次数:70  
标签:文件 Excel 逗号 BOM 格式 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数据时遇到过的坑,希望读者们在遇到类似问题时能第一时间想到原因和解决方案,避免在坑里徘徊太久。

 

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

标签:文件,Excel,逗号,BOM,格式,CSV,隐藏
From: https://www.cnblogs.com/huaweiyun/p/17024402.html

相关文章

  • datetime 格式化日期的符号
    %y两位数的年份表示(00-99)%Y四位数的年份表示(000-9999)%m月份(01-12)%d月内中的一天(0-31)%H24小时制小时数(0-23)%I12小时制小时数(01-12) %M分钟数(00=59)%S秒(00-59) %a本地......
  • 2-返回数据的时间格式化
    2-返回数据的时间格式化在我们返回数据的时候,我们返回的Json时间是很长的一串,很明显这对前端并不友好所以我们要对这个时间进行格式化处理{"date":"2022-01-13T23......
  • Html - 标题标签,段落标签,换行标签,文本格式化标签,盒子标签div,span,图像标签,超链接标签,表
    1.标题标签<h1~h6></h1~h6> 2.段落标签与换行标签<p>我是一个段落<br>我是换行标签</p><p>我是一条段落1</p><br><p>我是一条段落2</p> 3.文本格式化标......
  • 格式化时间
    //这个函数网上随处可见,我也是应用了别人的。exportfunctionformatDate(date,fmt){if(/(y+)/.test(fmt)){fmt=fmt.replace(RegExp.$1,(date.getFu......
  • p标签设置行数,超出部分用省略号隐藏
    p{overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;word-wrap:break-word;display:-webkit-box;-webkit-box-orient:verti......
  • python——时间格式转换,time.strftime()与time.strptime()
    strftime: 将给定格式的日期时间对象转换为字符串。日期时间对象=>字符串,控制输出格式strptime:将字符串解析为给定格式的日期时间对象。字符串=>日期时间对象,解析字符串......
  • python——json格式的转换,json.dumps(),json.loads(),json.dump(),json.load()
    1、json.dumps(),json.loads()json.dumps()将python对象(dict)编码成Json字符串(str)json.loads()将Json字符串(str)解码成python对象(dict)  一般构造接口数据......
  • 处理docx解析为Html格式
    处理docx解析为html格式这里需要使用mammoth.js的依赖,以Vue中使用为例npminstallmammoth--savedata(){return{wordText:'',//用来保存解析好的ht......
  • Excel 自定义格式
    Excel自定义格式代码的结构,常规情况下分为四部分,中间用英文的分号;分隔,每一段的意思是:正数格式;负数格式;零格式;文本格式如果使用条件判断,每一段的意思是:[条件1]指定......
  • ogg格式音乐批量转换为mp3
    今天我发现在qq音乐客户端下载的音乐是ogg格式的,拿到蓝牙音响上面放的时候不识别。于是我需要将ogg音乐文件批量转换为mp3格式。有些网站可以在线转换,但是有个数限制,且上......