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:
trueorfalse - 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
- zawk: https://github.com/linux-china/zawk
- qsv: https://github.com/jqnatividad/qsv
- DuckDB: https://duckdb.org/
- csvbase: a simple web database - https://github.com/calpaterson/csvbase
- TableTool: A native, beautiful, and blazing-fast GUI to explore CSVs - https://tabletool.io/
References
- RFC 4180: Definition of the CSV format https://datatracker.ietf.org/doc/html/rfc4180
- CSV on the Web: A Primer: https://www.w3.org/TR/tabular-data-primer/
- CSV on the Web: Use Cases and Requirements - https://www.w3.org/TR/csvw-ucr/
- CSV FORMAT: HISTORY, ADVANTAGES AND WHY IT IS STILL POPULAR - https://bytescout.com/blog/csv-format-history-advantages.html