serial_csv

pub package ci License: MIT

带有保留类型和可空性的高性能 CSV 编码器和解码器。

简介

此包旨在快速编码和解码 CSV,同时保留所有类型信息。

与 JSON 相比,CSV 是一种更紧凑的格式,无需“美化”即可阅读。

该包不使用整个 CSV 规范,而是使用一种更严格的、为性能优化的格式。

保留以下数据类型:Stringintdoubleboolnull

基准测试

基准测试由 300 亿个单元格(5000 行 x 3000 列 x 2000 次迭代)组成,在 Ryzen 5 5600X 上运行。

为了进行比较,使用了 csv (v5.0.2)、fast_csv (v0.1.44) 和 csvwriter (v1.3.0) 包。

benchmark

* jsonEncodejsonDecode 使用等效的数据表示。

您可以使用此 代码示例 运行基准测试。

CSV 结构

该库使用更严格的 CSV 格式来实现高性能。

  • 字符串单元格始终用双引号括起来
  • 数字和布尔值单元格不使用双引号
  • null 单元格编码为空单元格
  • 单元格内的双引号通过另一个双引号进行转义
  • 单元格由逗号分隔
  • 每行必须以 \n (LF) 结尾
  • 最后一行必须以 \n (LF) 结尾
  • 不允许注释(#

没有“供应商锁定”,因为 CSV 仍然是有效的 CSV。您可以使用任何其他 CSV 库来读取 CSV。

请注意,不要使用其他工具修改 CSV,因为您可能会破坏严格的格式。

用法

使用 SerialCsv.encodeSerialCsv.decode 进行 CSV 的编码和解码。

"a","b","c"
1,2.3,"3"
4,,true

String encoded = SerialCsv.encode([
  ['a', 'b', 'c'],
  [1, 2.3, '3'],
  ['4', null, true],
]);

List<List<dynamic>> decoded = SerialCsv.decode(encoded);

// The type information is retained.
String s = decoded[0][0]; // 'a'
int i = decoded[1][0]; // 1
double d = decoded[1][1]; // 2.3
bool b = decoded[2][2]; // true
Object? n = decoded[2][1]; // null

仅字符串

编码和解码仅包含字符串单元格的行列表。不允许 null

const rows = [
  ['a', 'b', 'c'],
  ['1', '2', '3'],
  ['4', '5', 'true'],
];

String encoded = SerialCsv.encodeStrings(rows);
List<List<String>> decoded = SerialCsv.decodeStrings(encoded);

键值

编码和解码非嵌套的 Map。键必须是字符串。值可以是任何支持的类型。

const map = {
  'a': '1',
  'b': 2,
  'c': 3.4,
  'd': true,
  'e': null,
};

String encoded = SerialCsv.encodeMap(map);
Map<String, dynamic> decoded = SerialCsv.decodeMap(encoded);

// The type information is retained.
String s = decoded['a']; // '1'
int i = decoded['b']; // 2
double d = decoded['c']; // 3.4
bool b = decoded['d']; // true
Object? n = decoded['e']; // null

GitHub

查看 Github