CSV文件的格式规范及其在常见软件中的导入导出方法 – Zenggyu的博客 您所在的位置:网站首页 导出sql文件是转储吗还是导出导向的文件格式 CSV文件的格式规范及其在常见软件中的导入导出方法 – Zenggyu的博客

CSV文件的格式规范及其在常见软件中的导入导出方法 – Zenggyu的博客

2024-07-15 03:05| 来源: 网络整理| 查看: 265

CSV文件的格式规范及其在常见软件中的导入导出方法 计算机技术 作者

zenggyu

发布于

2019-12-04

摘要 介绍CSV文件格式的规范,以及如何在常用软件中导入和导出该类文件。 引言

逗号分隔值(Comma-Separated-Values, CSV)格式是指以半角逗号作为分隔符来分隔文本中不同字段的文件格式。由于存储形式和规则简单,该格式能够被几乎所有数据库、数据分析软件识别,因此常常被用作数据传输的中间格式。

尽管CSV格式被广泛使用,但它们的存储规则仍缺乏一个唯一的标准,不同的软件可能会采用基于不同规范的实现。如果不事先了解各种程序所依据规范并据此做出应对,那么在使用该格式进行数据传输时可能就会对数据完整性造成破坏。

本文将研究几种常用软件对CSV文件的读入和写出行为,以期得到实现数据完整传输的方案。为达到该目的,本文将引入最接近标准的CSV规范——RFC 4180 (Shafranovich 2005) 作为参考依据,研究如何使用各种软件导入导出符合该规范的CSV文件;另外,对于无法兼容该规范的软件,本文还将介绍相应的注意事项。

关于RFC 4180及W3C组织的有关建议

RFC 4180是互联网工程任务组(Internet Engineering Task Force, IETF)在2005年发布的CSV文件规范 (Shafranovich 2005) 。尽管前面提到CSV文件格式仍然缺乏世界公认的标准,但从W3C组织对RFC 4180的介绍 (CSV on the Web Working Group 2015) 可以看出,该规范就是事实上的标准;因此,在处理CSV文件时应尽可能地遵循该规范。

RFC 4180对CSV文件格式的核心定义如下:

文件中的各条记录必须位于不同行,其间以换行符CRLF分隔。例如: aaa,bbb,ccc CRLF zzz,yyy,xxx CRLF 最后一条记录的末尾可以不包括换行符。例如: aaa,bbb,ccc CRLF zzz,yyy,xxx 文件中的首条记录可以是字段名(但这不是必要的),且其所含的名称数量及存储规则须与其他记录保持一致。 field_name,field_name,field_name CRLF aaa,bbb,ccc CRLF zzz,yyy,xxx CRLF 每条记录中可以包含一个或多个字段,每个字段以半角逗号分隔。文件中的所有记录必须拥有相同数量的字段。字段中的空格属于字段取值,不可忽略。每条记录的最后一个字段之后不应再添加半角逗号。例如 aaa,bbb,ccc 每个字段可以用半角双引号括起来(但这不一定是必要的)。如果字段没有被双引号括起来,那么字段中不应该出现双引号。例如: "aaa","bbb","ccc" CRLF zzz,yyy,xxx 含有换行符、半角双引号或半角逗号的字段应该用半角双引号括起来。例如: "aaa","b CRLF bb","ccc" CRLF zzz,yyy,xxx 如果字段被半角双引号括起来了,那么在表示字段取值中本身含有的半角双引号时,需要在其前方增加一个半角双引号。例如: "aaa","b""bb","ccc"

W3C组织在RFC 4180的基础上提出了更多CSV文件的使用建议 (CSV on the Web Working Group 2015) ,其中三项特别值得注意的是:

在(类)Unix系统上,可使用LF(而不是CRLF)作为CSV文件的换行符; 无论是在(类)Unix系统还是在Windows系统上,均建议使用UTF-8作为文本的字符编码; 日期、时间戳类数据必须使用规范的文本格式表示(例如ISO8601)。 测试数据

本文将以 表 1 所示数据作为测试数据,来研究如何在各种软件中导入导出符合前述规范的CSV文件。该表格取自维基百科 (Wikipedia 2019) ,笔者对其进行了少量修改,使修改后的数据中同时含有以下特殊字符(串):

半角逗号:该字符在CSV文件中具有特殊含义,是字段分隔符; 半角双引号:该字符在CSV文件中具有特殊含义,用于封闭含有特殊字符的字段取值; 换行符:该字符在CSV文件中具有特殊含义,是记录分隔符; 反斜杠:有的程序在读取CSV文本时会将该字符视为转义符,使得以该字符开头的字符串表达出特殊含义(例如\t等同于制表符),而RFC 4180并未定义这种用法; 中文字符:中文字符必须使用ASCII以外的字符编码进行存储,这要求相关程序能够按指定的方式对CSV文件内容进行解码、编码; 空字符串(empty string)和空值(null):表中model字段含有一个空字符串,而description字段含有一个空值(为区别前者, 表 1 中的空值以NULL表示,但不同软件有不同的表示方法,详见后文),这两者将被用于测试有关程序是否能对其进行正确区分(注:RFC 4180并没有明确定义空字符串和空值的区分方法,此测试只是为了能够更深入了解有关程序的行为); 时间戳:时间戳字符串具有特定的格式,还可能涉及时区信息,需要相关程序进行额外的解析。

只要含有上述字符(串)的内容能够被准确地导入、导出,那么理论上同样的方法就能够准确地处理任何内容。

表 1: tb_test数据集(NULL表示空值) date_time manufacturer model description price 1997-01-01 00:00:01 福特 E350 ac, abs, moon 3000 1999-01-01 00:00:01 雪佛兰 Venture “Extended Edition” \t 4900 1999-01-01 00:00:01 雪佛兰 NULL 5000 1996-01-01 00:00:01 吉普 Grand Cherokee MUST SELL!air, moon roof, loaded 4799

以下是 表 1 所示数据在一个符合RFC 4180规范的CSV文件tb_test.csv中的存储形式;特别值得注意的是,表中的空字符串被半角双引号所围绕,而空值则没有(见第三行):

1997-01-01 00:00:01,福特,E350,"ac, abs, moon",3000 1999-01-01 00:00:01,雪佛兰,"Venture ""Extended Edition""",\t,4900 1999-01-01 00:00:01,雪佛兰,"",,5000 1996-01-01 00:00:01,吉普,Grand Cherokee,"MUST SELL! air, moon roof, loaded",4799

因为有的数据库软件不支持在CSV文件中存储字段名,所以本文使用不包含字段名的文件进行测试;此外,本文还采纳W3C的建议,以LF作为换行符、UTF8作为字符编码,并选取符合ISO8601标准的时间戳格式存储时间数据。

正文

以下开始介绍如何在各种软件中导入tb_test.csv文件内的数据,以及如何在各软件中生成 表 1 所示测试数据并以CSV格式导出。为了充分展示各软件在处理CSV文件时可调节的相关参数、使操作方法能得到推广,本文会尽可能减少对默认参数的依赖,并显式定义各种参数。另外,针对数据库类软件,本文将优先介绍通过类SQL指令实现的方法,因为一般来说各种数据库均会提供这种方法。

R

R语言的readr包1提供了read_delim()和write_delim()等函数分别用于导入、导出CSV文件。以下是在R语言中导入tb_test.csv的方法:

1 本次测试所用的readr包版本为1.3.1。

library(readr) tb_test_r


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有