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 解析器实现
45,487 每月下载量
用于 16 个 crate(13 直接使用)
550KB
8K SLoC
csv-async
这是一个用于异步环境的 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
并使 AsyncReader
(AsyncWriter
) 基于基于 tokio::io::AsyncRead
(tokio::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