在tsv和csv之间选择

时间:2012-06-21 00:41:56

标签: csv tsv

我有一个输出表的程序,我想知道csv和tsv格式之间是否有任何优点/缺点。

5 个答案:

答案 0 :(得分:39)

TSV是一种非常有效的Javascript / Perl / Python处理方式,而且不会丢失  任何打字信息,也易于人类阅读。

自公开发布以来,4store一直支持该格式  它被广泛使用。

我看待它的方式是:CSV用于加载到电子表格中,TSV是  用于通过定制软件进行处理。

You can see here the technical specification of each here.

答案 1 :(得分:16)

选择取决于应用程序。简而言之,如果您的字段不包含逗号,请使用CSV;否则TSV就是你的选择。

<强> TL; DR

在这两种格式中,当分隔符出现在字段中时会出现问题,因此有必要指出分隔符不是作为字段分隔符工作,而是作为字段中的值,这可能有点痛苦。

例如,使用CSV:Kalman, Rudolfvon Neumann, JohnGabor, Dennis

有些basic approaches是:

  • 删除字段中显示的所有分隔符。

    E.g。 Kalman Rudolfvon Neumann JohnGabor Dennis

  • 转义角色(通常预先添加反斜杠\)。

    E.g。 Kalman\, Rudolfvon Neumann\, JohnGabor\, Dennis

  • 将每个字段用其他字符括起来(通常是双引号")。

    E.g。 "Kalman, Rudolf""von Neumann, John""Gabor, Dennis"

CSV

字段以逗号,分隔。

例如:

Name,Score,Country
Peter,156,GB
Piero,89,IT
Pedro,31415,ES

优点:

  • 与非技术人员分享时,它更通用,更有用, 因为大多数软件包都可以在不播放的情况下阅读它 设置。

缺点:

  • 在字段中转义逗号可能会令人沮丧,因为没有 每个人都遵循标准。
  • 所有额外的转义字符和引号都会增加最终文件大小的重量。

TSV

字段由制表<TAB>\t

分隔

例如:

Name<TAB>Score<TAB>Country
Peter<TAB>156<TAB>GB
Piero<TAB>89<TAB>IT
Pedro<TAB>31415<TAB>ES

优点:

  • 没有必要转义分隔符,因为通常在字段中包含制表符。否则,应将其删除。

缺点:

  • 不太普遍。

答案 2 :(得分:3)

您可以使用任何所需的分隔符,但许多应用程序(包括Excel,MySQL,PostgreSQL)都支持制表符和逗号。逗号在文本字段中很常见,因此如果您将它们转义,则需要转义更多的逗号。如果你没有逃脱它们并且你的字段可能包含逗号,那么你就可以自信地运行&#34; sort -k2,4&#34;在你的文件上。您可能需要在字段中转义一些字符(空字节,换行符等)。出于这些原因以及更多原因,我倾向于在字段中使用TSV,转义选项卡,空字节和换行符。此外,使用TSV通常更容易。只需通过制表符分隔符拆分每一行。对于CSV,有引号字段,可能是带换行符的字段等。我强迫使用时只使用CSV。

答案 3 :(得分:1)

我认为通常csv比tsv格式支持更频繁。

答案 4 :(得分:0)

TSV-utils 做了一个有趣的比较,之后复制到这里。简而言之,使用 TSV。

比较 TSV 和 CSV 格式

TSV 和 CSV 格式之间的差异可能令人困惑。明显的区别是默认的字段分隔符:TSV 使用 TAB,CSV 使用逗号。两者都使用换行符作为记录分隔符。

就其本身而言,使用不同的字段分隔符并不是特别重要。更重要的是处理数据中出现的分隔符的方法。 CSV 使用转义语法来表示数据中的逗号和换行符。 TSV 采取了不同的方法,不允许在数据中使用制表符和换行符。

转义语法使 CSV 能够完全表示常见的书面文本。这非常适合人工编辑的文档,尤其是电子表格。这种普遍性是有代价的:阅读它需要程序来解析转义语法。虽然难度不大,但还是很容易出错,尤其是在编写一次性程序时。在处理 CSV 文件时使用 CSV 解析器是一种很好的做法。 cutsortawkdiff 等传统 Unix 工具不处理 CSV 转义符,需要其他工具。

相比之下,解析 TSV 数据很简单。可以使用大多数编程语言中的典型 readline 例程读取记录。可以使用 split 例程找到每条记录中的字段。可以通过提供正确的字段分隔符来调用 Unix 实用程序,例如awk -F "\t"sort -t $'\t'。不需要特殊的解析器。这要可靠得多。它也更快,没有使用 CPU 时间来解析转义语法。

速度优势对于面向记录的操作尤其明显。记录计数 (wc -l)、重复数据删除 (uniq、tsv-uniq)、文件拆分 (headtailsplit)、改组 (GNU {{ 1}}、tsv-sample) 等。TSV 更快,因为可以使用高度优化的换行搜索例程(例如 shuf)找到记录边界。识别 CSV 记录边界需要完全解析每条记录。

这些特性使 TSV 格式非常适合数据挖掘和机器学习环境中常见的大型表格数据集。这些数据集很少需要字段中的制表符和换行符。

最常见的 CSV 转义格式使用引号来分隔包含分隔符的字段。引号也必须转义,这是通过使用一对引号来表示单引号来完成的。考虑下表中的数据:

<头>
Field-1 Field-2 Field-3
ABC 你好,世界! 定义
你好 说“你好,世界!” jkl

在 Field-2 中,第一个值包含逗号,第二个值包含引号和逗号。这是 CSV 表示,使用转义符表示数据中的逗号和引号。

memchr

在上面的例子中,只有带分隔符的字段被引用。引用所有字段(无论它们是否包含分隔符)也很常见。以下 CSV 文件等效:

Field-1,Field-2,Field-3
abc,"hello, world!",def
ghi,"Say ""hello, world!""",jkl

这是 TSV 中的相同数据。由于不涉及转义,因此要简单得多:

"Field-1","Field-2","Field-3"
"abc","hello, world!","def"
"ghi","Say ""hello, world!""","jkl"

TSV 和 CSV 之间的相似性可能会导致混淆哪些工具是合适的。进一步混淆这种混淆的是,数据文件使用逗号作为字段分隔符,但数据中没有逗号、引号或换行符,这在某种程度上是常见的。这些文件中不需要 CSV 转义符,这意味着可以使用 Field-1 Field-2 Field-3 abc hello, world! def ghi Say "hello, world!" jkl cut 等传统 Unix 工具来处理这些文件。此类文件有时称为“简单 CSV”。它们相当于以逗号作为字段分隔符的 TSV 文件。传统的 Unix 工具和 tsv-utils 工具可以通过指定字段分隔符来正确处理这些文件。但是,“简单的 csv”是一个非常临时且定义不明确的概念。处理这些文件时的一个简单预防措施是在其他处理步骤之前运行 CSV-to-TSV 转换器,如 csv2tsv。

请注意,许多 CSV 到 TSV 转换工具实际上并没有删除 CSV 转义符。相反,许多工具用 TAB 代替逗号作为记录分隔符,但仍使用 CSV 转义符来表示数据中的 TAB、换行符和引号字符。 awksortawk 等 Unix 工具无法可靠地处理此类数据。 tsv-utils 中的 csv2tsv 工具通过用空格(可自定义)替换 TAB 和换行符来避免转义。这适用于绝大多数数据挖掘场景。

要查看特定 CSV 到 TSV 转换工具的作用,请转换包含引号、逗号、制表符、换行符和双引号字段的 CSV 数据。例如:

cut

生成 CSV 转义的方法会将许多输出字段括在双引号中。

参考文献: