我有一个输出表格的程序,我想知道csv和tsv格式之间是否有任何优点/缺点。
b1zrtrql1#
TSV对于Javascript/Perl/Python来说是一种非常高效的处理方式,不会丢失任何类型信息,而且也易于人类阅读。自从公开发布以来,4store就支持这种格式,而且使用得相当广泛。我的看法是:CSV用于加载到电子表格中,TSV用于通过定制软件进行处理。You can see here the technical specification of each here.
vvppvyoh2#
具体的选择取决于应用程序,简而言之,如果你的字段不包含逗号,就使用CSV;否则TSV是可行之路。
在这两种格式中,当分隔符可能出现在字段中时,就会出现问题,因此必须指出分隔符不是用作字段分隔符,而是用作字段中的值,这可能有点麻烦。例如,使用CSV:一个月一次,一个月一次,一个月二次一些basic approaches包括:
例如,x1米3英寸1x、x1米4英寸1x、x1米5英寸1x
\
例如Kalman\, Rudolf、von Neumann\, John、Gabor\, Dennis
Kalman\, Rudolf
von Neumann\, John
Gabor\, Dennis
"
例如,x1米11纳米1x、x1米12纳米1x、x1米13纳米1x∮ ∮ ∮ ∮字段之间用逗号,分隔。例如:
,
Name,Score,Country Peter,156,GB Piero,89,IT Pedro,31415,ES
优点:
缺点:
∮ ∮ ∮ ∮字段由表格<TAB>或\t分隔例如:
<TAB>
\t
Name<TAB>Score<TAB>Country Peter<TAB>156<TAB>GB Piero<TAB>89<TAB>IT Pedro<TAB>31415<TAB>ES
vmdwslir3#
TSV-utils做了一个有趣的比较,在这里复制。简单地说,使用TSV。
TSV和CSV格式之间的区别可能会令人困惑。最明显的区别是默认字段分隔符:TSV使用TAB,CSV使用逗号。两者都使用换行符作为记录分隔符。使用不同的字段分隔符本身并不是特别重要。更重要的是数据中出现分隔符的方法。CSV使用转义语法来表示数据中的逗号和换行符。TSV采用不同的方法,不允许数据中出现TAB和换行符。转义语法使CSV能够完全表示常见的书面文本。这非常适合人工编辑的文档,尤其是电子表格。这种通用性是有代价的:读取它需要程序解析转义语法。虽然不是特别困难,但仍然很容易出错,特别是在编写一次性程序时。处理CSV文件时使用CSV解析器是一个好的做法。传统的Unix工具如cut、sort、awk和diff不处理CSV转义,需要替代工具。相比之下,解析TSV数据很简单。可以使用大多数编程语言中的典型readline例程读取记录。可以使用split例程找到每个记录中的字段。可以通过提供正确的字段分隔符(例如awk -F "\t"、sort -t $'\t')来调用Unix实用程序。不需要特殊的解析器。这要可靠得多。它也更快。解析转义语法不使用CPU时间。速度优势在面向记录的操作中尤为明显。记录计数(wc -l),重复数据消除(uniq,tsv-uniq),文件拆分(head,tail,split),随机播放(GNU shuf,tsv示例),TSV更快,因为可以使用高度优化的换行搜索例程(例如memchr)来找到记录边界。识别CSV记录边界需要完全解析每个记录。这些特性使TSV格式非常适合数据挖掘和机器学习环境中常见的大型表格数据集。这些数据集的字段中很少需要制表符和换行符。最常见的CSV转义格式使用引号来分隔包含分隔符的字段。引号也必须转义,这是通过使用一对引号来表示单引号来完成的。请考虑下表中的数据:| 字段-1|字段-2|字段-3|| - ------|- ------|- ------|| 美国广播公司|你好,世界!|定义|| 吉|说"你好,世界!"|杰克尔|在字段-2中,第一个值包含逗号,第二个值包含引号和逗号。下面是CSV表示,使用转义符表示数据中的逗号和引号。
cut
sort
awk
diff
readline
split
awk -F "\t"
sort -t $'\t'
wc -l
uniq
head
tail
shuf
memchr
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工具如cut和awk可以用来处理这些文件。这样的文件有时被称为"简单CSV"。它们相当于以逗号作为字段分隔符的TSV文件,传统的Unix工具和tsv-utils工具可以通过指定字段分隔符来正确处理这些文件。"simple csv"是一个非常特殊且定义不清的概念。处理这些文件时,一个简单的预防措施是运行一个CSV到TSV转换器,如csv2tsv,在其他处理步骤之前。请注意,许多CSV到TSV转换工具实际上并没有删除CSV转义符。相反,许多工具用TAB代替逗号作为记录分隔符,但仍然使用CSV转义符来表示数据中的TAB、换行符和引号字符。sort、awk、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来避免这些问题!
1yjd4xko4#
您可以使用任何分隔符,但许多应用程序都支持制表符和逗号,包括Excel、MySQL、PostgreSQL。逗号在文本字段中很常见,因此如果您对它们进行转义,则需要对更多逗号进行转义。如果您不对它们进行转义,并且您的字段可能包含逗号,则您无法放心地运行“sort-k2”,4”。无论如何,您可能需要转义字段中的某些字符(空字节,换行符,等等)。由于这些原因,我更喜欢在字段中使用TSV,转义制表符,空字节和换行符。另外,使用TSV通常更容易。用制表符分隔每一行。使用CSV有带引号的字段,可能有换行符的字段,等等。我只在被迫的时候使用CSV。
oxalkeyp5#
我认为一般的csv格式比tsv格式更受支持。
iih3973s6#
TAB分隔符的另一个小优点是,当您需要在Excel中快速检查时,即无需通过PowerQuery等加载,只需在记事本中打开,在Excel中使用CTRL+A、CTRL+C和CTRL+V即可。如果你用CSV做这个,整个事情福尔斯了。
6条答案
按热度按时间b1zrtrql1#
TSV对于Javascript/Perl/Python来说是一种非常高效的处理方式,不会丢失任何类型信息,而且也易于人类阅读。
自从公开发布以来,4store就支持这种格式,而且使用得相当广泛。
我的看法是:CSV用于加载到电子表格中,TSV用于通过定制软件进行处理。
You can see here the technical specification of each here.
vvppvyoh2#
具体的选择取决于应用程序,简而言之,如果你的字段不包含逗号,就使用CSV;否则TSV是可行之路。
在这两种格式中,当分隔符可能出现在字段中时,就会出现问题,因此必须指出分隔符不是用作字段分隔符,而是用作字段中的值,这可能有点麻烦。
例如,使用CSV:一个月一次,一个月一次,一个月二次
一些basic approaches包括:
例如,x1米3英寸1x、x1米4英寸1x、x1米5英寸1x
\
)。例如
Kalman\, Rudolf
、von Neumann\, John
、Gabor\, Dennis
"
)将每个字段括起来。例如,x1米11纳米1x、x1米12纳米1x、x1米13纳米1x
∮ ∮ ∮ ∮
字段之间用逗号
,
分隔。例如:
优点:
缺点:
∮ ∮ ∮ ∮
字段由表格
<TAB>
或\t
分隔例如:
优点:
缺点:
vmdwslir3#
TSV-utils做了一个有趣的比较,在这里复制。简单地说,使用TSV。
比较TSV和CSV格式
TSV和CSV格式之间的区别可能会令人困惑。最明显的区别是默认字段分隔符:TSV使用TAB,CSV使用逗号。两者都使用换行符作为记录分隔符。
使用不同的字段分隔符本身并不是特别重要。更重要的是数据中出现分隔符的方法。CSV使用转义语法来表示数据中的逗号和换行符。TSV采用不同的方法,不允许数据中出现TAB和换行符。
转义语法使CSV能够完全表示常见的书面文本。这非常适合人工编辑的文档,尤其是电子表格。这种通用性是有代价的:读取它需要程序解析转义语法。虽然不是特别困难,但仍然很容易出错,特别是在编写一次性程序时。处理CSV文件时使用CSV解析器是一个好的做法。传统的Unix工具如
cut
、sort
、awk
和diff
不处理CSV转义,需要替代工具。相比之下,解析TSV数据很简单。可以使用大多数编程语言中的典型
readline
例程读取记录。可以使用split
例程找到每个记录中的字段。可以通过提供正确的字段分隔符(例如awk -F "\t"
、sort -t $'\t'
)来调用Unix实用程序。不需要特殊的解析器。这要可靠得多。它也更快。解析转义语法不使用CPU时间。速度优势在面向记录的操作中尤为明显。记录计数(
wc -l
),重复数据消除(uniq
,tsv-uniq),文件拆分(head
,tail
,split
),随机播放(GNUshuf
,tsv示例),TSV更快,因为可以使用高度优化的换行搜索例程(例如memchr
)来找到记录边界。识别CSV记录边界需要完全解析每个记录。这些特性使TSV格式非常适合数据挖掘和机器学习环境中常见的大型表格数据集。这些数据集的字段中很少需要制表符和换行符。
最常见的CSV转义格式使用引号来分隔包含分隔符的字段。引号也必须转义,这是通过使用一对引号来表示单引号来完成的。请考虑下表中的数据:
| 字段-1|字段-2|字段-3|
| - ------|- ------|- ------|
| 美国广播公司|你好,世界!|定义|
| 吉|说"你好,世界!"|杰克尔|
在字段-2中,第一个值包含逗号,第二个值包含引号和逗号。下面是CSV表示,使用转义符表示数据中的逗号和引号。
在上例中,只有带分隔符的字段才会被引用。无论字段是否包含分隔符,通常都要引用所有字段。以下CSV文件是等效的:
以下是TSV中的相同数据。由于不涉及转义,因此要简单得多:
TSV和CSV之间的相似性可能会导致混淆哪些工具是合适的。进一步混淆的是,有些数据文件使用逗号作为字段分隔符,但数据中没有逗号、引号或换行符。这些文件中不需要CSV转义。这意味着传统的Unix工具如
cut
和awk
可以用来处理这些文件。这样的文件有时被称为"简单CSV"。它们相当于以逗号作为字段分隔符的TSV文件,传统的Unix工具和tsv-utils工具可以通过指定字段分隔符来正确处理这些文件。"simple csv"是一个非常特殊且定义不清的概念。处理这些文件时,一个简单的预防措施是运行一个CSV到TSV转换器,如csv2tsv,在其他处理步骤之前。请注意,许多CSV到TSV转换工具实际上并没有删除CSV转义符。相反,许多工具用TAB代替逗号作为记录分隔符,但仍然使用CSV转义符来表示数据中的TAB、换行符和引号字符。
sort
、awk
、tsv-utils中的csv2tsv工具通过将TAB和换行符替换为空格(可自定义)来避免转义,这在绝大多数数据挖掘场景中都能很好地工作。要查看特定CSV到TSV转换工具的功能,请转换包含引号、逗号、制表符、换行符和双引号字段的CSV数据。例如:
生成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来避免这些问题!
1yjd4xko4#
您可以使用任何分隔符,但许多应用程序都支持制表符和逗号,包括Excel、MySQL、PostgreSQL。逗号在文本字段中很常见,因此如果您对它们进行转义,则需要对更多逗号进行转义。如果您不对它们进行转义,并且您的字段可能包含逗号,则您无法放心地运行“sort-k2”,4”。无论如何,您可能需要转义字段中的某些字符(空字节,换行符,等等)。由于这些原因,我更喜欢在字段中使用TSV,转义制表符,空字节和换行符。另外,使用TSV通常更容易。用制表符分隔每一行。使用CSV有带引号的字段,可能有换行符的字段,等等。我只在被迫的时候使用CSV。
oxalkeyp5#
我认为一般的csv格式比tsv格式更受支持。
iih3973s6#
TAB分隔符的另一个小优点是,当您需要在Excel中快速检查时,即无需通过PowerQuery等加载,只需在记事本中打开,在Excel中使用CTRL+A、CTRL+C和CTRL+V即可。
如果你用CSV做这个,整个事情福尔斯了。