2 个不稳定版本
0.2.0 | 2023年2月12日 |
---|---|
0.1.0 | 2023年2月11日 |
#2146 in 编码
用于 pretty-csv
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());