在tsv和csv之间选择

1dkrff03  于 2023-03-05  发布在  其他
关注(0)|答案(6)|浏览(252)

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

b1zrtrql

b1zrtrql1#

TSV对于Javascript/Perl/Python来说是一种非常高效的处理方式,不会丢失任何类型信息,而且也易于人类阅读。
自从公开发布以来,4store就支持这种格式,而且使用得相当广泛。
我的看法是:CSV用于加载到电子表格中,TSV用于通过定制软件进行处理。
You can see here the technical specification of each here.

vvppvyoh

vvppvyoh2#

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

    • TL; DR**

在这两种格式中,当分隔符可能出现在字段中时,就会出现问题,因此必须指出分隔符不是用作字段分隔符,而是用作字段中的值,这可能有点麻烦。
例如,使用CSV:一个月一次,一个月一次,一个月二次
一些basic approaches包括:

  • 删除字段中出现的所有分隔符。

例如,x1米3英寸1x、x1米4英寸1x、x1米5英寸1x

  • 转义字符(通常在前面附加反斜杠\)。

例如Kalman\, Rudolfvon Neumann\, JohnGabor\, Dennis

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

例如,x1米11纳米1x、x1米12纳米1x、x1米13纳米1x
∮ ∮ ∮ ∮
字段之间用逗号,分隔。
例如:

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

优点:

  • 没有必要对分隔符进行转义,因为在一个字段中使用制表符是不常见的。否则,应该将其删除。

缺点:

  • 它不太普遍。
vmdwslir

vmdwslir3#

TSV-utils做了一个有趣的比较,在这里复制。简单地说,使用TSV。

比较TSV和CSV格式

TSV和CSV格式之间的区别可能会令人困惑。最明显的区别是默认字段分隔符:TSV使用TAB,CSV使用逗号。两者都使用换行符作为记录分隔符。
使用不同的字段分隔符本身并不是特别重要。更重要的是数据中出现分隔符的方法。CSV使用转义语法来表示数据中的逗号和换行符。TSV采用不同的方法,不允许数据中出现TAB和换行符。
转义语法使CSV能够完全表示常见的书面文本。这非常适合人工编辑的文档,尤其是电子表格。这种通用性是有代价的:读取它需要程序解析转义语法。虽然不是特别困难,但仍然很容易出错,特别是在编写一次性程序时。处理CSV文件时使用CSV解析器是一个好的做法。传统的Unix工具如cutsortawkdiff不处理CSV转义,需要替代工具。
相比之下,解析TSV数据很简单。可以使用大多数编程语言中的典型readline例程读取记录。可以使用split例程找到每个记录中的字段。可以通过提供正确的字段分隔符(例如awk -F "\t"sort -t $'\t')来调用Unix实用程序。不需要特殊的解析器。这要可靠得多。它也更快。解析转义语法不使用CPU时间。
速度优势在面向记录的操作中尤为明显。记录计数(wc -l),重复数据消除(uniq,tsv-uniq),文件拆分(headtailsplit),随机播放(GNU shuf,tsv示例),TSV更快,因为可以使用高度优化的换行搜索例程(例如memchr)来找到记录边界。识别CSV记录边界需要完全解析每个记录。
这些特性使TSV格式非常适合数据挖掘和机器学习环境中常见的大型表格数据集。这些数据集的字段中很少需要制表符和换行符。
最常见的CSV转义格式使用引号来分隔包含分隔符的字段。引号也必须转义,这是通过使用一对引号来表示单引号来完成的。请考虑下表中的数据:
| 字段-1|字段-2|字段-3|
| - ------|- ------|- ------|
| 美国广播公司|你好,世界!|定义|
| 吉|说"你好,世界!"|杰克尔|
在字段-2中,第一个值包含逗号,第二个值包含引号和逗号。下面是CSV表示,使用转义符表示数据中的逗号和引号。

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

在上例中,只有带分隔符的字段才会被引用。无论字段是否包含分隔符,通常都要引用所有字段。以下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转义。这意味着传统的Unix工具如cutawk可以用来处理这些文件。这样的文件有时被称为"简单CSV"。它们相当于以逗号作为字段分隔符的TSV文件,传统的Unix工具和tsv-utils工具可以通过指定字段分隔符来正确处理这些文件。"simple csv"是一个非常特殊且定义不清的概念。处理这些文件时,一个简单的预防措施是运行一个CSV到TSV转换器,如csv2tsv,在其他处理步骤之前。
请注意,许多CSV到TSV转换工具实际上并没有删除CSV转义符。相反,许多工具用TAB代替逗号作为记录分隔符,但仍然使用CSV转义符来表示数据中的TAB、换行符和引号字符。sortawk、tsv-utils中的csv2tsv工具通过将TAB和换行符替换为空格(可自定义)来避免转义,这在绝大多数数据挖掘场景中都能很好地工作。
要查看特定CSV到TSV转换工具的功能,请转换包含引号、逗号、制表符、换行符和双引号字段的CSV数据。例如:

$ echo $'Line,Field1,Field2\n1,"Comma: |,|","Quote: |""|"\n"2","TAB: |\t|","Newline: |\n|"' | <csv-to-tsv-converter>

生成CSV转义的方法会将许多输出字段用双引号括起来。
参考文献:

  • Wikipedia: Tab-separated values-TSV格式的有用描述。

  • IANA TSV specification-制表符分隔值mime类型的正式定义。

  • Wikipedia: Comma-separated-values-描述CSV和相关格式。

  • RFC 4180-IETF CSV格式描述,最接近CSV的实际标准。

  • 布伦达诺/茨武蒂尔斯:tsvutils的哲学-Brendan O'Connor对在他的开源工具包中使用TSV格式的基本原理的讨论。

  • 托马斯Burette幽默而准确的博客文章描述了ad-hoc CSV解析的问题。当然,您可以使用TSV来避免这些问题!

1yjd4xko

1yjd4xko4#

您可以使用任何分隔符,但许多应用程序都支持制表符和逗号,包括Excel、MySQL、PostgreSQL。逗号在文本字段中很常见,因此如果您对它们进行转义,则需要对更多逗号进行转义。如果您不对它们进行转义,并且您的字段可能包含逗号,则您无法放心地运行“sort-k2”,4”。无论如何,您可能需要转义字段中的某些字符(空字节,换行符,等等)。由于这些原因,我更喜欢在字段中使用TSV,转义制表符,空字节和换行符。另外,使用TSV通常更容易。用制表符分隔每一行。使用CSV有带引号的字段,可能有换行符的字段,等等。我只在被迫的时候使用CSV。

oxalkeyp

oxalkeyp5#

我认为一般的csv格式比tsv格式更受支持。

iih3973s

iih3973s6#

TAB分隔符的另一个小优点是,当您需要在Excel中快速检查时,即无需通过PowerQuery等加载,只需在记事本中打开,在Excel中使用CTRL+A、CTRL+C和CTRL+V即可。
如果你用CSV做这个,整个事情福尔斯了。

相关问题