serial_csv
带有保留类型和可空性的高性能 CSV 编码器和解码器。
简介
此包旨在快速编码和解码 CSV,同时保留所有类型信息。
与 JSON 相比,CSV 是一种更紧凑的格式,无需“美化”即可阅读。
该包不使用整个 CSV 规范,而是使用一种更严格的、为性能优化的格式。
保留以下数据类型:String、int、double、bool、null。
基准测试
基准测试由 300 亿个单元格(5000 行 x 3000 列 x 2000 次迭代)组成,在 Ryzen 5 5600X 上运行。
为了进行比较,使用了 csv (v5.0.2)、fast_csv (v0.1.44) 和 csvwriter (v1.3.0) 包。
* jsonEncode 和 jsonDecode 使用等效的数据表示。
您可以使用此 代码示例 运行基准测试。
CSV 结构
该库使用更严格的 CSV 格式来实现高性能。
- 字符串单元格始终用双引号括起来
- 数字和布尔值单元格不使用双引号
- null 单元格编码为空单元格
- 单元格内的双引号通过另一个双引号进行转义
- 单元格由逗号分隔
- 每行必须以
\n(LF) 结尾 - 最后一行必须以
\n(LF) 结尾 - 不允许注释(
#)
没有“供应商锁定”,因为 CSV 仍然是有效的 CSV。您可以使用任何其他 CSV 库来读取 CSV。
请注意,不要使用其他工具修改 CSV,因为您可能会破坏严格的格式。
用法
使用 SerialCsv.encode 和 SerialCsv.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
