逗号分隔值

✍ dations ◷ 2025-06-25 16:48:24 #逗号分隔值

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。

CSV文件的格式不存在通用标准,也没有指定所使用的字符编码,但是在RFC 4180中有基础性的描述,而7-bit ASCII是最基本的通用编码。

CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式上进行操作的(往往是私有的(英语:Proprietary format)和/或无规范的格式)。因为大量程序都支持某种CSV变体,至少是作为一种可选择的输入/输出格式。

例如,一个用户可能需要交换信息,从一个以私有格式存储数据的数据库程序,到一个数据格式完全不同的电子表格。最可能的情况是,该数据库程序可以导出数据为“CSV”,然后被导出的CSV文件可以被电子表格程序导入。

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

在这些常规的约束条件下,存在着许多CSV变体,故CSV文件不完全兼容。然而,这些差异非常小,而且有许多应用程序可以让用户预览文件(这是可行的,因为它是纯文本),甚至指定分隔符、转义规则等。如果一个特定CSV文件的差异过大,超出了特定接收程序的支持范围,那么可行的做法通常是人工检查并编辑文件,或通过简单的程序来修复问题。

逗号分隔值是一种数据格式,列表方式(“自由形式”)输入/输出被定义在FORTRAN 77(77代表1977年)中。列表方式的输入使用了逗号和/或空格作为分隔符,所以用来结束引文的字符串不能包含逗号或空格。

相对于固定列宽数据格式,逗号分隔值的列表不仅输入(例如输入到打孔卡)更加方便,而且当一个值被错打一列时也不容易产生错误结果。

逗号分隔列(CSL)是一种数据格式,起初在最古老的简单电脑中被称为逗号分隔值(CSV)。在个人电脑(当时更普遍地被称为“家用电脑”)产业,一个常见的应用是,小企业使用模板和邮件列表生成推销邮件。

CSL/CSV被用来作为简单的数据库。一些早期的软件应用,比如文字处理器,允许一系列“变量数据”在两个文件之间被合并:一个是模板文件,一个是包含姓名、地址和其它数据字段的CSL数据库。许多应用程序仍然有这种能力。

逗号分隔列过去和现在都被用于在两个不同架构的机器之间交换数据库信息。纯文本的CSV文件大幅避免了不兼容性,比如字节顺序和字长。这些文件大部分是可读的,所以在没有完美的文档或通讯的情况下仍然很容易处理。

CSV格式最好被用来表现记录集合或序列,其中的每条记录都有完全相同的字段序列。这相当于关系数据库中一个单一的关系,或者典型的电子表格中的数据(虽然不能计算)。

CSV格式没有被限定于某个特定字符集。不管用Unicode还是用ASCII,都没有问题(尽管特定程序支持的CSV可能会有它们自己的局限性)。和大部分的私有数据格式不同,CSV文件可以从一个字符集翻译到另外一个字符集。然而,CSV不提供任何途径来表明使用的是什么字符集,所以必须另外通讯,或在接收结束时指出(如果可能)。

如前所述,包含多个关系的数据库不能导出为单一的CSV文件。最多,只能添加更多的标识约定,例如标识和分隔不同的关系。这种标识并不难于设计和实现,但是因为没有这方面的约定,所以基本不具备可移植性。

同样地,CSV本身不能表达分层级的或面向对象的数据库或其它数据。这是因为每一条CSV记录都应当有同样的结构。CSV因此基本不适用于文档,比如由HTML、XML或者其它的标记语言或文字处理技术创建的。

字段会变化的统计数据库往往有着类似关系的结构,但是会有一些字段组是可重复的。例如,健康数据库如人口与健康调查(英语:Demographic and Health Surveys),对于一名给定的父母会为每个孩子重复一些问题(也许直到某个确定的最大的孩子数目)。统计分析系统往往包含可以“旋转”这类数据的工具:例如,一条包含5个孩子信息的“父母”记录,可以被分解为5条单独的记录,每条记录包含(a)一个孩子的信息,和(b)一份所有未指定孩子的信息的拷贝。CSV可以用“横的”或“竖的”形式来表达这类数据。

在关系数据库中,类似的问题很容易解决——为每个类似的组另外创建一个关系,并使用外键(如父母的身份证号或名字)将“孩子”记录与相关的“父母”记录连接起来。在标记语言如XML中,这类组会被包含在一个容器中(例如,<child>),然后按照需要重复该容器。对于CSV,则尚无被广泛接受的单文件解决方案。

“CSV”这个名字表示是用逗号来分隔数据字段的。然而,“CSV”这个术语还被广泛用于形式各异的一系列格式。例如,许多所谓的“CSV”文件实际上使用制表符代替逗号(这种文件可以更精确地被称为“TSV”,即制表符分隔值,Tab-Separated Values);一些实现允许或要求使用单引号或双引号来包裹某些或全部字段;还有一些实现保留最前面的一条记录作为表头来包含字段名序列。

其它的实现差别包括如何处理更多常见的字段分隔符(比如空格或分号)和在文本字段中的换行符。更加微妙的是对一个空行的翻译:写一条零字段的记录,或者一条有一个零长度字段的记录同样可以得到这样的结果;因此对它的解码是有歧义的——只不过这种歧义通常无伤大雅。

RFC 4180所记载的标准可以使CSV交换简单化。然而,这一标准仅指定了对基于文本的字段的处理。对各个字段的文本的翻译仍然是由引用程序指定的。特别地,并没有标准来指定如何表示小数,尽管它们普遍被嵌入在CSV数据中,并且一些国家使用点作为小数分隔符,一些国家使用逗号。例如,法文CSV文件可能将圆周率的近似值写为3,14159。

一个通用的(如果技术上不令人满意)互操作性解决方案是依赖人工介入:因为CSV文件是纯文本,用户可以通过使用文本编辑器轻易预览和诊断绝大部分(如果不是全部)问题。这样做的例子包括 Microsoft Access 等(关系)数据库产品,其在导入 CSV/TSV 这种数据时便允许用户一边预览一边调整诸如表头行、分隔符之类的选项。

“CSV”格式中大量变体的存在说明并没有一个“CSV标准”。在常见用法中,几乎任何定界符分隔的文本数据(英语:Delimiter-separated values)都可以被统称为“CSV”文件。不同的CSV格式可能不会兼容。

不过,RFC 4180是一个将CSV正式化的努力。它定义了互联网媒体类型“text/csv”,并且采用它的规则的CSV文件将会具有广泛的可移植性。它有如下要求:

这个格式很简单,可以被大部分声称可以读取CSV文件的程序处理。例外是(a)程序可以不支持在被包裹的字段中换行,(b)程序可以将可选的表头当作数据,或者将第一个数据行当作可选的表头。

该格式可以追溯至早期的商用电脑,它被广泛用于在电脑间传递数据,这些电脑可能会有不同的内在字长,需要不同的数据格式,等等。为此,CSV文件在所有电脑平台上通用。

CSV是一种分隔的(英语:Delimiter-separated values)文本文件,它使用逗号来分割值(许多CSV导入/导出工具的实现也允许使用其它的分隔符)。简单的CSV实现可以禁止字段值中包含逗号或其它特殊字符如换行符。更复杂的CSV实现允许这些特殊字符,它们往往要求用"(双引号)包裹这些包含保留字符(如逗号、双引号或不太通用的换行符)的数值。被嵌入的双引号字符可以用连续两个双引号来表示(Creativyst 2010),或者使用转义字符如反斜杠(例如在Sybase Central中)。

在计算机科学术语中,CSV文件可以被认为是一个“平面文件数据库”。

存在许多描述“CSV”格式的非正式文件。IETF RFC 4180(如上所述)定义了格式“text/csv”互联网媒体类型,并已注册于IANA。(Shafranovich 2005)另一个相关规范由含字段文本(英语:Fielded text)提供。Creativyst (2010)提供了一个概述,说明了在最广泛使用的应用程序中所使用的变体,并解释了CSV怎样才能最好地被使用和支持。

这些和其它“CSV”规范及实现的典型规则如下:

1997,Ford,E350
  • 任何字段都被(使用双引号字符)。某些字段被包裹,详见后续规则。
"1997","Ford","E350"
  • 如果字段包含被嵌入的逗号,必须被包裹。
1997,Ford,E350,"Super, luxurious truck"
  • 每个被嵌入的双引号字符必须被表示为两个双引号字符。
1997,Ford,E350,"Super, ""luxurious"" truck"
  • 如果字段包含被嵌入的换行,必须被包裹(然而,许多简单的CSV实现不支持字段内换行)。
1997,Ford,E350,"Go get one nowthey are going fast"
  • 在某些CSV实现中,起头和结尾的空格和制表符被截掉。。
1997, Ford, E350not same as1997,Ford,E350
  • 然而,该RFC并没有说当空白字符出现在被包裹的值之外该如何处理。
1997, "Ford" ,E350
  • 在截掉起头和结尾空格的CSV实现中,将这种空格视为有意义数据的字段必须被包裹。
1997,Ford,E350," Super luxurious truck "
  • 第一条记录可以是“表头”,它在每个字段中包含列名(并没有可靠途径来告知一个文件是否这样包含表头;然而,一般在列名中仅使用字母、数字和下划线,而不使用其它字符)。
Year,Make,Model1997,Ford,E3502000,Mercury,Cougar

举例

年份品牌型号描述价格
1997FordE350ac, abs, moon3000.00
1999ChevyVenture "Extended Edition"4900.00
1999ChevyVenture "Extended Edition, Very Large"5000.00
1996JeepGrand CherokeeMUST SELL!
air, moon roof, loaded
4799.00

以上数据表可以以CSV格式表示如下:

Year,Make,Model,Description,Price1997,Ford,E350,"ac, abs, moon",3000.001999,Chevy,"Venture ""Extended Edition""","",4900.001999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.001996,Jeep,Grand Cherokee,"MUST SELL!air, moon roof, loaded",4799.00

美国/英国的CSV文件(小数点是点,值分隔符是逗号)举例:

Year,Make,Model,Length1997,Ford,E350,2.342000,Mercury,Cougar,2.38

德国和荷兰同样的CSV/DSV(英语:Delimiter separated values)文件(小数点是逗号,值分隔符是分号)举例:

Year;Make;Model;Length1997;Ford;E350;2,342000;Mercury;Cougar;2,38

后者的格式是不遵循RFC 4180的。若要使它遵循,可以使用逗号代替分号作为分隔符,或者使用小数点表示法的国际符号,或者包裹所有包含小数点的数字。

CSV文件格式非常简单,被几乎所有的电子表格和数据库管理系统支持。许多编程语言都有可利用的库来支持CSV文件。许多实现都支持变换字段分隔字符和一些包裹约定以最大化接收者处理数据的机会,尽管使用最简单的约定是最安全的。

Microsoft Excel会打开.csv文件,但依赖于系统的地区设置,它可以使用分号作为分隔符来代替逗号,这是由于在某些语言中逗号被用作小数点。并且,Excel的许多地区版本不能在CSV中处理Unicode。当遇到这种困难时,一个简单的解决方案是将文件扩展名从.csv变为.txt;然后从一个已经运行的Excel中用“打开”命令打开文件。

当粘贴文本数据到Excel中时,通常制表符被用作分隔符:如果你复制“hello<tab>goodbye”到剪贴板中并把它粘贴到Excel中,它会进入到两个单元格中。“hello,goodbye”粘贴进Excel会进入一个单元格中,包括逗号。如果您在Excel中使用“文本到列”功能并且改变设置,它同样为粘贴进文本数据改变设置。

OpenOffice.org Calc和LibreOffice Calc处理CSV文件,并且通过一个对话框粘贴文本,对话框要求用户自己指定分隔符、编码、列格式等。

在类Unix系统上,有许多工具程序至少可以处理某些CSV文件。许多此类工具有办法改变分隔字符,但是很少能支持任何其它变体(或Unicode)。这些可用的程序有:

相关

  • 齿部,为汉字索引中的部首之一,康熙字典214个部首中的第二百一十一个(十五划唯一的部首)。就正体中文中,齿部归于十五划部首,而简体中文则归在八划。齿部只以左方、下方为部字。且
  • 2004 XR190425–850 km (albedo 0.16-0.04) 335–530 km (albedo 0.25-0.10)2004 XR190(也可以写成2004 XR190)是一颗位于离散盘的外海王星天体。它是由英国哥伦比亚大学的天文学家 L
  • 贵溪市贵溪市位于江西省东北部,是中国的铜工业中心。目前贵溪市三面包围了鹰潭市区,全市通行赣方言,并与福建省相毗邻。境内有国家重点风景名胜区、道教仙山——龙虎山。唐代置贵溪县
  • 国家建筑博物馆国立建筑博物馆(英语:National Building Museum)是位于美国华盛顿哥伦比亚特区的一家以建筑、设计、工程、建筑技术、城市规划为主题的博物馆,成立于1980年,由一家非营利机构运营
  • 帕维尔·谢苗诺维奇·雷巴尔科帕维尔·谢苗诺维奇·雷巴尔科(俄语:Павел Семенович Рыбалко,乌克兰语:Павло Семенович Рибалко,1894年11月4日-1948年8月28日)苏联军
  • 埃基·内斯托尔埃基·内斯托尔(爱沙尼亚语:Eiki Nestor;1953年9月5日-),是一名爱沙尼亚政治家、前社会民主党党魁,曾任爱沙尼亚国会议长。1976年内斯托尔自塔林理工大学机械工程系毕业;其后专业从
  • 国际设计大奖国际设计大奖(英语:International Design Awards)是一个为了挖掘更多设计人才由Lucie foundation在美国加利福尼亚州洛杉矶创立的奖项。奖项分类包括职业组以及学生组的建筑、
  • 陈汉标陈汉标(1906年-1982年),男,广东兴宁人,中国心理学家,华南师范大学教授,曾任第三、四届全国政协委员。
  • 卡尔顿·库斯卡尔顿·库斯(英语:Arthur Carlton Cuse)(1959年3月22日-) 是一位美国电视编剧和制作人,最为知名的作品是美国电视连续剧。1959年出生在墨西哥城,2010年被选为时代百大人物 。 卡尔
  • 井步山井步山位于台湾屏东县雾台乡,标高2066米,为屏东县管制山域之一。又名“阿猴富士山”(阿缑富士山),系因山形似富士山,日治时期称之为“阿缑富士”而来。