我有一个输出表的程序,我想知道csv和tsv格式之间是否有任何优点/缺点。
答案 0 :(得分:39)
TSV是一种非常有效的Javascript / Perl / Python处理方式,而且不会丢失 任何打字信息,也易于人类阅读。
自公开发布以来,4store一直支持该格式 它被广泛使用。
我看待它的方式是:CSV用于加载到电子表格中,TSV是 用于通过定制软件进行处理。
答案 1 :(得分:16)
选择取决于应用程序。简而言之,如果您的字段不包含逗号,请使用CSV;否则TSV就是你的选择。
<强> TL; DR 强>
在这两种格式中,当分隔符出现在字段中时会出现问题,因此有必要指出分隔符不是作为字段分隔符工作,而是作为字段中的值,这可能有点痛苦。
例如,使用CSV:Kalman, Rudolf
,von Neumann, John
,Gabor, Dennis
有些basic approaches是:
删除字段中显示的所有分隔符。
E.g。 Kalman Rudolf
,von Neumann John
,Gabor Dennis
转义角色(通常预先添加反斜杠\
)。
E.g。 Kalman\, Rudolf
,von Neumann\, John
,Gabor\, Dennis
将每个字段用其他字符括起来(通常是双引号"
)。
E.g。 "Kalman, Rudolf"
,"von Neumann, John"
,"Gabor, Dennis"
字段以逗号,
分隔。
例如:
Name,Score,Country
Peter,156,GB
Piero,89,IT
Pedro,31415,ES
优点:
缺点:
字段由制表<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 使用 TAB,CSV 使用逗号。两者都使用换行符作为记录分隔符。
就其本身而言,使用不同的字段分隔符并不是特别重要。更重要的是处理数据中出现的分隔符的方法。 CSV 使用转义语法来表示数据中的逗号和换行符。 TSV 采取了不同的方法,不允许在数据中使用制表符和换行符。
转义语法使 CSV 能够完全表示常见的书面文本。这非常适合人工编辑的文档,尤其是电子表格。这种普遍性是有代价的:阅读它需要程序来解析转义语法。虽然难度不大,但还是很容易出错,尤其是在编写一次性程序时。在处理 CSV 文件时使用 CSV 解析器是一种很好的做法。 cut
、sort
、awk
和 diff
等传统 Unix 工具不处理 CSV 转义符,需要其他工具。
相比之下,解析 TSV 数据很简单。可以使用大多数编程语言中的典型 readline
例程读取记录。可以使用 split
例程找到每条记录中的字段。可以通过提供正确的字段分隔符来调用 Unix 实用程序,例如awk -F "\t"
、sort -t $'\t'
。不需要特殊的解析器。这要可靠得多。它也更快,没有使用 CPU 时间来解析转义语法。
速度优势对于面向记录的操作尤其明显。记录计数 (wc -l
)、重复数据删除 (uniq
、tsv-uniq)、文件拆分 (head
、tail
、split
)、改组 (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、换行符和引号字符。 awk
、sort
和 awk
等 Unix 工具无法可靠地处理此类数据。 tsv-utils 中的 csv2tsv 工具通过用空格(可自定义)替换 TAB 和换行符来避免转义。这适用于绝大多数数据挖掘场景。
要查看特定 CSV 到 TSV 转换工具的作用,请转换包含引号、逗号、制表符、换行符和双引号字段的 CSV 数据。例如:
cut
生成 CSV 转义的方法会将许多输出字段括在双引号中。
参考文献: