2 个不稳定版本

0.2.0 2023年2月12日
0.1.0 2023年2月11日

#2146 in 编码


用于 pretty-csv

MIT 许可证

28KB
654

CsvStream

逐条反序列化 CSV。

用法

use csvstream::{ByteRecord, read_csv};

let mut csv = &b"1,2\n3,4"[..];
let records = read_csv(&mut csv).collect::<Vec<ByteRecord>>();
assert_eq!(records.len(), 2);
assert_eq!(&records[0][0], b"1");
assert_eq!(&records[0][1], b"2");
assert_eq!(&records[1][0], b"3");
assert_eq!(&records[1][1], b"4");

有关更多信息,请参阅文档


lib.rs:

逐条反序列化 CSV。

Csv 输入假定遵循 RFC4180,这是我们最接近标准的东西。

RFC4180 TLDR; CSV 是由换行符分隔的记录序列。记录包含字段。字段应该由逗号分隔。如果字段需要包含逗号,双引号或换行符,则该字段应使用双引号。在引号字段内,使用两个双引号表示字面双引号。

// basic normal fields
field 1,field 2,field 3

// Sparse fields
field 1,,field 3,""

// quoted fields. The values of the fields are: `field "1"`, `field "2"`, `field "3"`
"field ""1""","field ""2""", "field ""3"""

// quote fields with newlines in them
"this field
spans two lines", "this one does not"

RFC 没有提及以下常见情况


// empty records
field 1, field 2

field 5, field 6

// whitespace before/after a field
field 1,    field2
field 3  ,field 4

这些被视为有效,您将得到预期的结果。

Csv 标头不会被特殊处理。它们像任何其他记录一样被解析。

示例

您可以反序列化任何实现了 BufRead 特性的东西

use csvstream::{ByteRecord, read_csv};

let mut csv = &b"1,2\n3,4"[..];
let records = read_csv(&mut csv).collect::<Vec<ByteRecord>>();
assert_eq!(records.len(), 2);
assert_eq!(&records[0][0], b"1");
assert_eq!(&records[0][1], b"2");
assert_eq!(&records[1][0], b"3");
assert_eq!(&records[1][1], b"4");

这个包还提供了一个辅助方法来写入 CSV。这并不是真正的序列化,因为我们最初接收的是一个字符串,但它确实有助于在必要时正确地转义字段。

您可以写入任何实现了 Write 特性的东西

use csvstream::{write_csv_record};
use std::str::from_utf8;

let mut output: Vec<u8> = vec![];
write_csv_record(["hello", "world"], &mut output).unwrap();
assert_eq!("hello,world\n", from_utf8(&output).unwrap());

无运行时依赖