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数据时遇到过的坑,希望读者们在遇到类似问题时能第一时间想到原因和解决方案,避免在坑里徘徊太久。
CSV:简单格式下隐藏的那些坑的更多相关文章
- JAVA之编码---->CSV在文本下是正常的,用EXCEL打开是乱码的问题
JAVA之编码---->CSV在文本下是正常的,用EXCEL打开是乱码的问题 在JAVA下输出文件流,保存成CSV(用UTF-8)文件,怎么处理用EXCEL下是乱码,但是在记事本等其他软件都是正 ...
- js简单显示和隐藏div,触发超链接,动态更改button值,setInterval()简单使用,jquery easyui弹出框简单使用 .
js简单显示和隐藏div .<!DOCTYPE html> .<html> .<head> .<meta charset="UTF-8"& ...
- 简单聊下Unicode和UTF-8
今晚听同事分享提到这个,简单总结下. ## Unicode字符集 Unicode的出现是因为ASCII等其他编码码不够用了,比如ASCII是英语为母语的人发明的,只要一个字节8位就能够表示26个英文字 ...
- SSDT Hook实现简单的进程隐藏和保护【转载】
原文链接:http://www.blogfshare.com/ssdthook-hide-protect.html 原文作者:AloneMonkey SSDT Hook实现简单的进程隐藏和保护 Alo ...
- 持续集成 windows下jenkins常见问题填坑
[过程改进]持续集成 windows下jenkins常见问题填坑 没有什么高深的东西,1 2天的时间大多数人都能自己摸索出来,这里将自己遇到过的问题分享出来避免其他同学再一次挖坑. 目录 1. 主从节 ...
- 测试不同格式下depth buffer的精度
这篇文章主要是参考MJP的“Attack of The Depth Buffer”,测试不同格式下depth buffer的精度. 测试的depth buffer包含两类: 一是非线性的depth b ...
- 简单分析下用yii2的yii\helpers\Html类和yii.js实现的post请求
yii2提供了很多帮助类,比如Html.Url.Json等,可以很方便的实现一些功能,下面简单说下这个Html.用yii2写view时时经常会用到它,今天在改写一个页面时又用到了它.它比较好用的地方就 ...
- python读取与写入csv,txt格式文件
python读取与写入csv,txt格式文件 在数据分析中经常需要从csv格式的文件中存取数据以及将数据写书到csv文件中.将csv文件中的数据直接读取为dict类型和DataFrame是非常方便也很 ...
- 在AJAX里 使用【 XML 】 返回数据类型 实现简单的下拉菜单数据
在AJAX里 使用XML返回数据类型 实现简单的下拉菜单数据 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN ...
- 一个简单的QQ隐藏图生成算法 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传
一个简单的QQ隐藏图生成算法 隐藏图不是什么新鲜的东西,具体表现在大部分社交软件中,预览图看到的是一张图,而点开后看到的又是另一张图.虽然很早就看到过这类图片,但是一直没有仔细研究过它的原理,今天 ...
随机推荐
- Go 函数多返回值错误处理与error 类型介绍
Go 函数多返回值错误处理与error 类型介绍 目录 Go 函数多返回值错误处理与error 类型介绍 一.error 类型与错误值构造 1.1 Error 接口介绍 1.2 构造错误值的方法 1. ...
- 虹科干货 | 什么是Redis数据集成(RDI)?
大量的应用程序.日益增长的用户规模.不断扩展的技术需求,以及对即时响应的持续追求.想想这些是否正是你在经历的.也许你尝试过自己构建工具来应对这些需求,但是大量的编码和集成工作使你焦头烂额.那你是否知道 ...
- ElectronReactAdmin跨平台管理系统|electron27+react18后台模板EXE
基于electron27+react18+arco电脑端后台管理程序EXE实例ElectronRAdmin. electron27-react18-admin 基于跨平台技术Electron集成Vit ...
- 查找数组中第K大的元素
要查找一个数组中的第 K 大元素,有多种方法可以实现,其中常用的方法是使用分治算法或快速选择算法,这两种方法的时间复杂度到时候O(n). 快速选择算法示例: package main import & ...
- MySQL简易教程
本文是参考廖雪峰老师的,但是网站广告有点多,我就在本地抄写一份,一方面是为了加强记忆巩固基础,另一方面也是就是为了第一方面.廖雪峰老师Mysql教程直达地址:https://www.liaoxuefe ...
- L2-037 包装机
#include <bits/stdc++.h> using namespace std; const int N = 110; stack<char> stk[N]; int ...
- C++ MiniZip实现目录压缩与解压
Zlib是一个开源的数据压缩库,提供了一种通用的数据压缩和解压缩算法.它最初由Jean-Loup Gailly和Mark Adler开发,旨在成为一个高效.轻量级的压缩库,其被广泛应用于许多领域,包括 ...
- 【Javaweb】瑞吉外卖你冲不冲?冲冲!冲!冲冲!(数据库环境搭建)(maven项目搭建)一
图形界面创建数据库(Navicat) 命令行方式创建 瑞吉项目一共涉及到十一张表 导入表结构,既可以使用上面的图形界面,也可以使用MySQL命令: 通过命令导入表结构时,注意sql文件不要放在中文目录 ...
- Gradio-Lite: 完全在浏览器里运行的无服务器 Gradio
Gradio 是一个经常用于创建交互式机器学习应用的 Python 库.在以前按照传统方法,如果想对外分享 Gradio 应用,就需要依赖服务器设备和相关资源,而这对于自己部署的开发人员来说并不友好. ...
- keil 5 安装教程
一.下载 keil 官网 二.安装教程 1.开始安装 双击安装包,开始安装,直接下一步 2.勾选同意,下一步 3.选择软件安装路径,下一步 4.填写信息 可以随意填写,下一步. 5.等待安装 6.安装 ...