#csv #serialization #serde #csv-core

no-std serde-csv-core

为无_std crate提供的CSV序列化

4个版本 (2个重大更新)

0.3.1 2024年5月9日
0.3.0 2024年5月9日
0.2.0 2023年4月16日
0.1.1 2023年4月3日
0.1.0 2023年4月2日

#157 in 嵌入式开发

Download history 207/week @ 2024-05-03 50/week @ 2024-05-10 167/week @ 2024-05-17 170/week @ 2024-05-24 202/week @ 2024-05-31 126/week @ 2024-06-07 186/week @ 2024-06-14 129/week @ 2024-06-21 138/week @ 2024-06-28 186/week @ 2024-07-05 219/week @ 2024-07-12 105/week @ 2024-07-19 98/week @ 2024-07-26 207/week @ 2024-08-02 197/week @ 2024-08-09 138/week @ 2024-08-16

每月653次下载

MIT/Apache

38KB
809 代码行

serde-csv-core

Crates.io Released API docs Continuous integration

为无_std crate提供的CSV序列化和反序列化。

serde-csv-core基于csv-core crate构建。它不需要任何内存分配,这意味着它非常适合嵌入式环境。

序列化

Writer一次序列化一条记录。

use heapless::String;
use serde::Serialize;

#[derive(Serialize)]
struct Record {
    pub country: String<32>,
    pub city: String<32>,
    pub population: u32,
}

let records = [
    Record {
        country: "Poland".into(),
        city: "Cracow".into(),
        population: 766_683,
    },
    Record {
        country: "Japan".into(),
        city: "Tokyo".into(),
        population: 13_515_271,
    },
];

let mut writer = serde_csv_core::Writer::new();
let mut csv = [0; 128];
let mut nwritten = 0;
for record in &records {
    nwritten += writer.serialize(&record, &mut csv[nwritten..])?;
}

assert_eq!(&csv[..nwritten], b"Poland,Cracow,766683\nJapan,Tokyo,13515271\n");

反序列化

Reader<N>一次反序列化一条记录。 N 是用于临时存储未转义的字段的内部缓冲区的容量。

use heapless::{String, Vec};
use serde::Deserialize;

#[derive(Debug, PartialEq, Eq, Deserialize)]
struct Record {
    pub country: String<32>,
    pub city: String<32>,
    pub population: u32,
}

let csv = b"Poland,Cracow,766683\nJapan,Tokyo,13515271\n";

let mut reader = serde_csv_core::Reader::<32>::new();
let mut records: Vec<Record, 2> = Vec::new();
let mut nread = 0;
while nread < csv.len() {
    let (record, n) = reader.deserialize::<Record>(&csv[nread..])?;
    records.push(record);
    nread += n;
}

assert_eq!(records, &[
    Record {
        country: "Poland".into(),
        city: "Cracow".into(),
        population: 766_683,
    },
    Record {
        country: "Japan".into(),
        city: "Tokyo".into(),
        population: 13_515_271,
    },
]);

许可证

根据您的选择,许可受Apache License,版本2.0或MIT许可。

除非您明确声明,否则根据Apache-2.0许可定义,您有意提交的任何贡献,都应按上述方式双重许可,没有任何附加条款或条件。

依赖项

~2.5MB
~50K SLoC