什么是CSV

逗号分隔值(Comma-Separated Values,CSV),其文件以纯文本形式存储表格数据(数字和文本),文件的每一行都是一个数据记录。每个记录由一个或多个字段组成,用逗号分隔。使用逗号作为字段分隔符是此文件格式的名称的来源,因为分隔字符也可以不是逗号,有时也称为字符分隔值。

CSV广泛用于不同体系结构的应用程序之间交换数据表格信息,解决不兼容数据格式的互通问题,一般按照传输双方既定标准进行格式定义,而其本身并无明确格式标准。

CSV用逗号分隔字段的基本思想是清楚的,但是当字段数据也可能包含逗号或者甚至嵌入换行符时,该想法变得复杂。 CSV实现可能无法处理这些字段数据,或者可能会使用引号来包围字段。引用并不能解决所有问题:有些字段可能需要嵌入引号,因此CSV实现可能包含转义字符或转义序列。

RFC 4180提出了MIME类型(”text/csv”)对于CSV格式的标准,可以作为一般使用的常用定义,满足大多数实现似乎遵循的格式。

CSV的格式规范

下面的格式规范定义来源于RFC 4180,附上原文供参考,一共也就七点。

1. 每一行记录位于一个单独的行上,用回车换行符CRLF(也就是\r\n)分割。

Each record is located on a separate line, delimited by a line break (CRLF). For example:

aaa,bbb,ccc CRLF

zzz,yyy,xxx CRLF

1

2

2. 文件中的最后一行记录可以有结尾回车换行符,也可以没有。

The last record in the file may or may not have an ending line break. For example:

aaa,bbb,ccc CRLF

zzz,yyy,xxx

1

2

3. 第一行可以存在一个可选的标题头,格式和普通记录行的格式一样。标题头要包含文件记录字段对应的名称,应该有和记录字段一样的数量。(在MIME类型中,标题头行的存在与否可以通过MIME type中的可选”header”参数指明)

There maybe an optional header line appearing as the first line of the file with the same format as normal record lines. This header will contain names corresponding to the fields in the file and should contain the same number of fields as the records in the rest of the file (the presence or absence of the header line should be indicated via the optional “header” parameter of this MIME type). For example:

field_name,field_name,field_name CRLF

aaa,bbb,ccc CRLF

zzz,yyy,xxx CRLF

1

2

3

4. 在标题头行和普通行每行记录中,会存在一个或多个由半角逗号(,)分隔的字段。整个文件中每行应包含相同数量的字段,空格也是字段的一部分,不应被忽略。每一行记录最后一个字段后不能跟逗号。(通常用逗号分隔,也有其他字符分隔的CSV,需事先约定)

Within the header and each record, there may be one or more fields, separated by commas. Each line should contain the same number of fields throughout the file. Spaces are considered part of a field and should not be ignored. The last field in the record must not be followed by a comma. For example:

aaa,bbb,ccc

1

5. 每个字段可用也可不用半角双引号(“)括起来(不过有些程序,如Microsoft的Excel就根本不用双引号)。如果字段没有用引号括起来,那么该字段内部不能出现双引号字符。

Each field may or may not be enclosed in double quotes (however some programs, such as Microsoft Excel, do not use double quotes at all). If fields are not enclosed with double quotes, then double quotes may not appear inside the fields. For example:

"aaa","bbb","ccc" CRLF

zzz,yyy,xxx

1

2

6. 字段中若包含回车换行符、双引号或者逗号,该字段需要用双引号括起来。

Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes. For example:(下面原文的例子可能有些问题)

"aaa","b CRLF

bb","ccc" CRLF

zzz,yyy,xxx

1

2

3

7. 如果用双引号括字段,那么出现在字段内的双引号前必须加一个双引号进行转义。

If double-quotes are used to enclose fields, then a double-quote appearing inside a field must be escaped by preceding it with another double quote. For example:

"aaa","b""bb","ccc"

1

关于CSV文件解析

上面说过,CSV并不是一种单一的、定义明确的格式(尽管RFC 4180有一个被通常使用的定义)。因此在实践中,术语“CSV”泛指具有以下特征的任何文件:

纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312;

由记录组成(典型的是每行一条记录);

每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);

每条记录都有同样的字段序列。

所以,在常规的约束条件下,存在着许多CSV变体,故CSV文件并不完全互通,如使用约定好的其他分隔符、转义规则等。因此,实际使用CSV需要数据交换双方约定规则(其实大体思路不变,一些细节),在进行CSV文件读写就免不了进行文件的解析。

正如CSV并不明确的格式,CSV文件的解析同样没有标准方法,一般可以自己实现读写,网上也有很多种不同语言的实现版本。例如opencsv、csvreader等。它们可能会与RFC中的规定有所出入,例如在csvreader中有要求:

前缀和后缀的空格字符,逗号和制表符,与逗号或记录分隔符相邻的内容将被修剪。

为了保证前导和后缀空白字符的保留,必须通过将字段嵌入到双引号集合中来限定字段。

使用时需要注意。

csv格式文件解析失败_理解CSV格式规范(解析CSV必备)相关推荐

  1. cad转dxf格式文件太大_想知道DWG、DWT、DWS和DXF是什么吗?从了解4种CAD图形格式开始吧...

    原创:就说我在开发区 常用图形文件格式盘点 CAD中的图形文件格式共9种,其扩展名分别为: ❶DWG – 图形或块文件 ❷DWT – 图形样板文件 ❸DWS – 图形标准文件 ❹DXF – 图形交换文 ...

  2. cjz格式文件打开方式_鹏业四川CJZ整体解决方案

    有不少朋友在问cjz格式文件用什么软件打开?cjz是现在四川评标用的格式. 1.CJZ是符合由四川省造价站,鹏业软件西南设计院共同编制的,四川省建设工程造价电子数据标准,所生成的数据文件简称CJZ工程 ...

  3. csv格式文件解析失败_由导出CSV文件格式错误的小结

    问题描述: 目前.一般情况下,在web开发过程中,使用导入导出报表的情形很多.我们先说导出.项目数据量多导出行数较多,50万行左右,选择的是csv方式导出.针对以下应用场景,导出过程有几点需要注意的的 ...

  4. python从csv提取需要的数据_使用Python从文本(CSV文件)中提取数据

    我正在帮助一个狗救助小组分析他们即将被收养的申请.所有应用程序都是通过在线系统输入的,每个应用程序都将获得一个自动生成的表单ID.然后将申请分配给不同的志愿者进行处理. 大多数信息都很简单,我可以使用 ...

  5. 如何用Matlab批量读取Excel 表格 .csv .xlsx .xls格式文件并整合成一个.mat格式文件保存

    一个文件夹有三百多多个.csv格式的表格,我需要读取所有的表格,提取每一个表格的第7列,然后将所有表格的第七列的数据依次排列整合在一个表格中. 下图为处理前的文件的一部分 下面是实现这些功能的Matl ...

  6. python如何读取csv文件列表页_每25行读取一个csv文件,并使用python传递到列表

    我想读取一个文件,并将该文件的每25行转换为一个列表,也就是说,它应该有4个列表,每个列表中包含25个项目(对于一个文件的100行).我无法获得这个问题的代码. 输入文件看起来像这样,实际上它有100 ...

  7. linux 虚拟机大量udp请求失败_理解 Linux 网络栈:Linux 网络协议栈简单总结分析...

    1. Linux 网络路径 1.1 发送端 1.1.1 应用层 (1) Socket 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的.Linu ...

  8. 小程序转h5之后 vant文件查找失败:_你还在使用原生开发小程序吗

    最近帮别人在做一个小程序,因为官方的支持不够好,组件库也不够多,所以就没有使用官方的操作.网上查找了一番,觉得mpvue还不错(之前也没玩过),索性拿来用吧! 01 前言 小程序的做法也是比较简单的, ...

  9. xml文件 卷积神经网络_理解卷积神经网络中的输入与输出形状(Keras实现)

    即使我们从理论上理解了卷积神经网络,在实际进行将数据拟合到网络时,很多人仍然对其网络的输入和输出形状(shape)感到困惑.本文章将帮助你理解卷积神经网络的输入和输出形状. 让我们看看一个例子.CNN ...

最新文章

  1. SAP HUM已知一个内部HU号码,如何得到HU号码?
  2. 3.9 神经网络的梯度下降法-深度学习-Stanford吴恩达教授
  3. Java二分查找、折半查找
  4. Subst DOS命令
  5. 使用自定义DelegatingHandler编写更整洁的Typed HttpClient
  6. [Python] NotImplemented 和 NotImplementedError 区别
  7. 安装eclipse插件sts
  8. PAT (Basic Level) Practice1026 程序运行时间
  9. pcl_view简单使用
  10. android 删除开机动画,Android删除开机动画bootanimation.zip
  11. VBScript 基础知识
  12. android 自定义圆点,Android自定义带圆点的半圆形进度条
  13. java阳历转为阴历错了一天_Java 阴历阳历转换
  14. python语音合成并播放_语音合成篇
  15. 【Python】-转载-画出美国队长的盾牌(重点五角星)
  16. 【内网学习笔记】23、SMBExec 与 DCOM 的使用
  17. css-属性、样式调节
  18. 排队模拟JAVA程序_java 模拟窗口排队
  19. 第三次团队作业——系统设计
  20. 火狐插件FoxyProxy的使用方法

热门文章

  1. 平民级数字人up主制作技术教程
  2. centos服务器之间copy文件夹命令,复制文件与文件夹的CentOS常用命令
  3. Kesci“魔镜杯”风控算法大赛复赛解决方案
  4. Struts2.x 学习笔记 之 国际化
  5. 28BYJ-48步进电机驱动程序
  6. python-web自动化测试-验证码的处理(通过记录cookie,实现自动登录)
  7. [渝粤教育] 西南科技大学 公共政策学 在线考试复习资料
  8. 苹果设计组件库_建立设计系统和组件库
  9. 台式电脑开机跳出来计算机,各种台式电脑、笔记本无法开机出现英文提示,解决办法都在这里...
  10. Python pygame study surface