#text-file #file-reader #file-line #reader #line-comment #split #comments

advreader

将文本文件分割为文本序列、字符串和(行)注释

7个稳定版本

2.3.0 2024年7月10日
2.2.1 2024年7月10日
2.2.0 2024年1月26日
2.0.0 2023年11月11日
1.2.0 2023年9月10日

#230 in 文本处理

Download history 2/week @ 2024-05-29 7/week @ 2024-06-05 3/week @ 2024-06-12 1/week @ 2024-06-26 25/week @ 2024-07-03 269/week @ 2024-07-10 4/week @ 2024-07-17 43/week @ 2024-07-24 15/week @ 2024-07-31

331 每月下载量
pyadvreader 中使用

MIT 许可证

130KB
3.5K SLoC

advreader

此库提供了一种简单的方法,以字节切片的形式读取输入行,以提高效率。它基本上是标准库中的 lines,但它以字节切片的形式读取每一行(&[u8])。在您不太关心unicode的情况下,这比 lines() 执行得快得多,基本上和手动编写循环一样快。虽然代码本身相当简单,但我已经将它集成到最近写的至少4个工具中,所以我觉得是时候有一个方便的crate了。

安装

此工具将通过 Crates.io 提供,因此您可以在您的 Cargo.toml 中将其添加为依赖项

[dependencies]
advreader = "2.0.0"

用法

这很简单;在您通常在 BufRead 实现者上调用 lines 的地方,您现在可以调用 byte_lines 来检索一个用于遍历行作为 &[u8] 的结构(从而避免分配)。有两种使用API的方法,下面都展示了

// our input file we're going to walk over lines of, and our reader
let file = File::open("./my-input.txt").expect("able to open file");
let reader = BufReader::new(file);
let mut lines = reader.byte_lines();

// Option 1: Walk using a `while` loop.
//
// This is the most performant option, as it avoids an allocation by
// simply referencing bytes inside the reading structure. This means
// that there's no copying at all, until the developer chooses to.
while let Some(line) = lines.next() {
    // do something with the line
}

// Option 2: Use the `Iterator` trait.
//
// This is more idiomatic, but requires allocating each line into
// an owned `Vec` to avoid potential memory safety issues. Although
// there is an allocation here, the overhead should be negligible
// except in cases where performance is paramount.
for line in lines.into_iter() {
    // do something with the line
}

此接口是在 advreader 的 v2.x 线系中引入的。在 v1.x 中,已经实现了 Iterator trait,但在尝试过于惯例化的同时,需要 unsafe 合同。这已经得到了修复,并且已经删除了所有不安全代码,同时为那些喜欢更简洁语法的人提供了 IntoIterator 实现。

依赖项

~230–395KB