10 个稳定版本

1.3.0 2024年2月18日
1.2.6 2023年3月4日
1.2.5 2022年12月28日
1.2.4 2022年1月6日
1.1.2 2020年11月21日

#75 in 解析器实现

Download history 9526/week @ 2024-04-09 9222/week @ 2024-04-16 12652/week @ 2024-04-23 14305/week @ 2024-04-30 16096/week @ 2024-05-07 12755/week @ 2024-05-14 12542/week @ 2024-05-21 11358/week @ 2024-05-28 11111/week @ 2024-06-04 10813/week @ 2024-06-11 11732/week @ 2024-06-18 12085/week @ 2024-06-25 10079/week @ 2024-07-02 13101/week @ 2024-07-09 10758/week @ 2024-07-16 9862/week @ 2024-07-23

45,487 每月下载量
用于 16 个 crate(13 直接使用)

MIT 许可证

550KB
8K SLoC

csv-async

crates.io Documentation Version

build status build status build status codecov

这是一个用于异步环境的 CSV 库。实现的 API 与现有的 csv crate 类似,但有少数例外,如使用 create_ 函数而不是 from_ 函数,就像在 csv 中那样。

部分代码来自 csv crate(与版本 1.3.3 同步 - 2023 年 10 月)。此包通过使用 csv-core crate 与 csv 共享 CSV 解析例程。此 crate 的大版本将与与之 API 兼容的 csv 的大版本保持同步。

CVS 文件通过 AsyncReader / AsyncWriter 对象从 / 到通用文本结构或通过 AsyncDeserializer / AsyncSerializer 从 / 到具有生成的 serde 接口的数据特定结构进行读取或写入。

库不包含同步读取器/写入器。如果您需要它,请使用 csv crate。

Cargo 功能

在库构建期间可以启用/禁用的功能。

功能 默认 描述
with_serde on 启用 crate 使用 serde derive 宏
tokio off 启用 crate 与 tokio 运行时和库一起使用

启用 tokio 功能允许用户使用 tokio::fs::File 并使 AsyncReaderAsyncWriter) 基于基于 tokio::io::AsyncReadtokio::io::AsyncWrite)。目前此 crate 依赖于 tokio 版本 1.25。

没有 tokio 功能时,此包只依赖于 futures 包和基于 traits 的读取器(写入器)futures::io::AsyncRead (futures::io::AsyncWrite),这允许用户使用 async_std::fs::File

示例用法

示例输入文件

city,region,country,population
Southborough,MA,United States,9686
Northbridge,MA,United States,14061
Marlborough,MA,United States,38334
Springfield,MA,United States,152227
Springfield,MO,United States,150443
Springfield,NJ,United States,14976
Concord,NH,United States,42605
use std::error::Error;
use std::process;
use futures::stream::StreamExt;
use async_std::fs::File;

async fn filter_by_region(region:&str, file_in:&str, file_out:&str) -> Result<(), Box<dyn Error>> {
    // Function reads CSV file that has column named "region" at second position (index = 1).
    // It writes to new file only rows with region equal to passed argument
    // and removes region column.
    let mut rdr = csv_async::AsyncReader::from_reader(
        File::open(file_in).await?
    );
    let mut wri = csv_async::AsyncWriter::from_writer(
        File::create(file_out).await?
    );
    wri.write_record(rdr
        .headers()
        .await?.into_iter()
        .filter(|h| *h != "region")
    ).await?;
    let mut records = rdr.records();
    while let Some(record) = records.next().await {
        let record = record?;
        match record.get(1) {
            Some(reg) if reg == region => 
                wri.write_record(record
                    .iter()
                    .enumerate()
                    .filter(|(i, _)| *i != 1)
                    .map(|(_, s)| s)
                ).await?,
            _ => {},
        }
    }
    Ok(())
}

fn main() {
    async_std::task::block_on(async {
        if let Err(err) = filter_by_region(
            "MA",
            "/tmp/all_regions.csv",
            "/tmp/MA_only.csv"
        ).await {
            eprintln!("error running filter_by_region: {}", err);
            process::exit(1);
        }
    });
}

有关 serde 的示例,请参阅文档 首页

计划

一些未来发展的想法

  • 创建基准测试,也许有一些性能改进。
  • 代码中标记为 TODO 的内容。
  • 支持 smol 异步运行时。
  • 创建更多示例和教程。

依赖项

~0.9–2.6MB
~45K SLoC