linux_china技术雷达linux_china技术雷达
采用

CSV(Comma-separated values)对程序员来说可以说是一个非常熟悉的格式,它是一种简单的文本格式,用于存储表格数据。 CSV文件通常由逗号分隔的值组成,但是也可以使用其他分隔符,如制表符(tab),被称之为TSV。

总的来说,CSV文件非常简单,主要就三个部分:

  • Header Row:头部行,通常是字段名,使用分隔符分隔
  • Delimiter:分隔符,通常包括,,;,\t,空格等
  • Data Rows:数据行,通常是字段值,使用分隔符分隔

这里重提CSV是因为它在数据处理和数据交换中仍然非常重要,借助于SIMD和列存储等技术,CSV文件的处理速度得到了很大提升, 如DuckDB、ClickHouse等OLAP产品都内置了CSV的支持。

在数据处理方面,AWK等工具也都内置了CSV的支持,可以方便地对CSV文件进行处理。

在数据交互方面,普通日志文件,metrics数据格式等,都可以被快速地转换为CSV格式,方便地进行数据分析。

如果你使用Nushell的话,CSV基本贯穿整个Nushell的数据处理过程,只需要通过| to csv就可以将数据转换为csv,如ls | to csv

就个人而言,我认为CSV是一个非常好的数据交换格式,它简单、易读、易写,而且在数据处理和数据交换中都有着广泛的应用。 加之工作的便捷CSV工具,DataFrame直接导入等,在程序中也非常容易处理。

在实际的项目中,可以将日志和metrics等非常方便地转换为CSV格式,然后存储到S3等对象存储中,结合DuckDB和ClickHouse, 原先昂贵的日志,metrics平台,现在只需要很少的成本就可以实现,对程序员来说也非常方便。

CSV格式定义:

  • Each record is located on a separate line, delimited by a line break (CRLF)
  • The last record in the file may or may not have an ending line break.
  • There maybe an optional header line appearing as the first line of the file with the same format as normal record lines.
  • Within the header and each record, there may be one or more fields, separated by commas.
  • Each field may or may not be enclosed in double quotes
  • Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes.
  • If double-quotes are used to enclose fields, then a double-quote appearing inside a field must be escaped by preceding it with another double quote.

注意: 在某些CSV实现中,起头和结尾的空格和制表符被截掉。这一实践是有争议的,也不符合RFC 4180。RFC 4180声明,所以空格被看作字段的一部分,不应当被忽略。

此外CSV文件的数据类型,这个规范也没有定义,但是考虑到OLAP数据分析的需要,如DuckDB, ClickHouse等,CSV还是有一定的数据类型的。 如目前DuckDB支持的CSV数据类型如下:

  • BOOLEAN: true or false
  • BIGINT: 1234567890
  • DOUBLE: 3.14
  • TIME: 13:47:30
  • DATE: 2000-01-07
  • TIMESTAMP: 2024-09-06T23:02:08.769+08:00
  • VARCHAR: normal text

关于日期的格式,DuckDB默认支持ISO 8859,同时还进行了一些扩展, 如%m-%d-%y%Y-%m-%d %H:%M:%S等,详细可以参考Dates and Timestamps.

CSV & Friends

References