在tsv和csv之间选择

PKo*_*lla 32 csv tsv

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

小智 43

TSV对于Javascript/Perl/Python来说是一个非常有效的处理方式,不会丢失任何输入信息,也很容易让人类阅读.

自公开发布以来,该格式已在4store中得到支持,并且使用起来相当广泛.

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

你可以在这里看到每个技术规格.

  • Excel中的CSV导入会受到分隔符依赖于区域设置的影响,有时它会",",有时会";"... (7认同)
  • 如果使用正确的语法和方法,可以将CSV或TSV加载到电子表格或定制软件中.TSV最初可能看起来更容易阅读,但使用CSV时,您可以清楚地看到两个逗号data1,data3之间存在空列,而TSV则不明显什么是空列以及相邻列中的空格data1 Data3 .Excel数据导入的问题不仅限于CSV格式,它还会更改时间格式而不会询问等.Excel不是导入数据集期间的可靠工具. (7认同)
  • @EricGrange您可以在编辑器中显示空格。但我想并不是每个人都能明白这一点。 (3认同)

tas*_*hka 17

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

TL; DR

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

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

一些基本方法是:

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

    例如Kalman Rudolf,von Neumann John,Gabor Dennis

  • 逃避角色(通常预先添加反斜杠\).

    例如Kalman\, Rudolf,von Neumann\, John,Gabor\, Dennis

  • 用其他字符(通常是双引号")包含每个字段.

    例如"Kalman, Rudolf","von Neumann, John","Gabor, Dennis"

CSV

字段用逗号分隔,.

例如:

Name,Score,Country
Peter,156,GB
Piero,89,IT
Pedro,31415,ES
Run Code Online (Sandbox Code Playgroud)

好处:

  • 与非技术人员共享时,它更通用,更有用,因为大多数软件包都可以在不使用设置的情况下读取它.

缺点:

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

TSV

该字段由一个制表分离<TAB>\t

例如:

Name<TAB>Score<TAB>Country
Peter<TAB>156<TAB>GB
Piero<TAB>89<TAB>IT
Pedro<TAB>31415<TAB>ES
Run Code Online (Sandbox Code Playgroud)

好处:

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

缺点:

  • 它不太普遍.


Mag*_*ero 11

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

比较 TSV 和 CSV 格式

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

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

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

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

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

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

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

场1 场2 场3
ABC 你好世界! 定义
说“你好,世界!” jkl

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

Field-1,Field-2,Field-3
abc,"hello, world!",def
ghi,"Say ""hello, world!""",jkl
Run Code Online (Sandbox Code Playgroud)

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

"Field-1","Field-2","Field-3"
"abc","hello, world!","def"
"ghi","Say ""hello, world!""","jkl"
Run Code Online (Sandbox Code Playgroud)

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

Field-1 Field-2 Field-3
abc hello, world!   def
ghi Say "hello, world!" jkl
Run Code Online (Sandbox Code Playgroud)

TSV 和 CSV 之间的相似性可能会导致人们对哪些工具合适感到困惑。进一步加剧这种混乱的是,数据文件使用逗号作为字段分隔符,但数据中没有逗号、引号或换行符,这种情况很常见。这些文件不需要 CSV 转义,这意味着传统的 Unix 工具喜欢cut并且awk可以用来处理这些文件。此类文件有时称为“简单 CSV”。它们相当于以逗号作为字段分隔符的 TSV 文件。传统的 Unix 工具和 tsv-utils 工具可以通过指定字段分隔符来正确处理这些文件。然而,“简单 csv”是一个非常临时且定义不明确的概念。使用这些文件时的一个简单预防措施是在其他处理步骤之前运行 CSV 到 TSV 转换器(例如 csv2tsv)。

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

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

$ echo $'Line,Field1,Field2\n1,"Comma: |,|","Quote: |""|"\n"2","TAB: |\t|","Newline: |\n|"' | <csv-to-tsv-converter>
Run Code Online (Sandbox Code Playgroud)

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

参考:


小智 5

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

  • TSV 不支持转义制表符:https://www.iana.org/assignments/media-types/text/tab-separated-values (5认同)