本文分享自华为云社区《》,作者:aKi。
前言
CSV(Comma-Separated Values),是一种通用的、相对简单的文件格式。其文件以纯文本形式存储表格数据,r语言读入tsv数据,文件可由任意数目的记录组成,记录间以换行符分隔,每条记录由字段组成,字段间的分隔符是特定字符或字符串,最常见的是以逗号作为分隔符。
例如:下面是一个含有三行内容的csv文件。
1、首先在Excel文件菜单上,单击打开。2、单击以选中TSV(为用制表符tab分隔的文件文件。3、如果文件是逗号分隔,单击下一步,然后继续执行步骤,如果文件是制表符分隔,单击完成,然后引用到下文 要保存将文件从 Excel中TSV 格式。
坑一:换行和逗号
前文中我们提到过CSV文件中每条记录是通过换行符分隔的,常用逗号作为分隔符。但在实际处理数据时会遇到字段中也存在换行和逗号的情况,如果A程序没有处理好对应的数据,在导入B程序时就会产生错误的数据或记录。
用WPS或Excel直接打开tvs文件,然后再将文件另存成xls格式的即可。
例如:下面CSV文件中第二行的记录中第四个字段中包含逗号和换行。
我们可以使用Excel工具来查看该文件文解析后的样子:
正确的数据处理方式是将包含逗号和换行的字段用双引号包围起来:
对应文件被解析后:
拓展一下,字段中的若本身就存在双引号,需要在字段自身的双引号前再加一个双引号。
比如我们在Airplane前加一个双引号表示字段本身的数据:
该文件使用本文工具打开以后是这样的:
坑二:BOM头
例如这里是两个内容完全相同的文件:
当一个包含BOM头,另一个不包含时,其二进制表达是不一样的:
坑三:CSV注入
CSV注入其实是一个安全漏洞,当CSV文件被Excel工具打开时,其字段数据被Excel解析,从而支持了Excel提供的所有动态功能。
在R中,可以使用read.table()来读取.tsv文件,但是,若原文件中有缺失值,可能会报错,可以使用fill=TRUE对缺失值进行填充,然而,由于这种填充方式是自动将有值的单元格向前移动,并将后面的缺失值填充为NA,因此,可能会。
下面我们来看一个例子:
我们将其中一个字段写成了=1+1,此时用Excel工具打开该文件:
=1+1被解析成了2
同理,利用此漏洞还可以执行任意程序。
用Execl打开时会出现如下提示:
tsv文件用wps打开:单击以选中 TSV(为用制表符tab分隔的文件) 或 CSV (为用逗号,分隔的文件)文件。如果文件逗号分隔,单击下一步, 然后继续执行步骤4。如果文件制表符分隔,单击完成,然后引用到下文 " 要保存将文件从 。
当然,该漏洞在较新版本的Excel中都被默认禁止了。在文件->选项->信任中心中外部内容设置中默认都是不勾选“启用动态数据交换服务器启动”。
用Excel,打开,里面选全部文件类型,然后选中tsv文件,就可以打开,然后另存成xls就可以