9个不稳定版本
0.5.2 | 2022年2月16日 |
---|---|
0.5.1 | 2021年5月31日 |
0.5.0 | 2019年10月27日 |
0.4.0 | 2019年4月24日 |
0.1.0 | 2018年4月29日 |
#480 in 文本处理
3,845 个月下载量
在 3 个包中使用(2 个直接使用)
69KB
733 行
EasyReader
此库的主要目标是允许用户在大型文件的行之间进行长距离导航,自由地前后移动或获取随机行,而无需消耗迭代器。
目前,通过Rust标准库的Lines(https://doc.rust-lang.net.cn/std/io/trait.BufRead.html#method.lines)只能逐行读取文件,这无法(或非常昂贵)读取反向行和获取随机行。此外,作为迭代器,已经读取的每一行都会被消耗,要回到同一行,需要重新实例化读取器并消耗所有行,直到所需的行(例如,在最后一行的情况下,所有行)。
注意
默认情况下,EasyReader不生成索引,它只是偶尔搜索行终止符,这使得它可以用于非常大的文件,无需“启动”时间和过度的内存消耗。然而,由于没有索引,读取速度较慢,并且无法以完美的分布获取随机行,因此有一个方法可以生成它;开始时间会变慢,但所有后续的读取都将使用它,因此会更快(不包括索引构建时间,读取时间略长,但与逐行正向读取Lines的读取时间相当),并且在随机读取的情况下,行将以完美的分布被选取。顺便说一下,不建议为非常大的文件生成索引,因为可能会发生过度的内存消耗。
示例:基本用法
use easy_reader::EasyReader;
use std::{
fs::File,
io::{
self,
Error
}
};
fn navigate() -> Result<(), Error> {
let file = File::open("resources/test-file-lf")?;
let mut reader = EasyReader::new(file)?;
// Generate index (optional)
reader.build_index();
// Move through the lines
println!("First line: {}", reader.next_line()?.unwrap());
println!("Second line: {}", reader.next_line()?.unwrap());
println!("First line: {}", reader.prev_line()?.unwrap());
println!("Random line: {}", reader.random_line()?.unwrap());
// Iteration through the entire file (reverse)
reader.eof();
while let Some(line) = reader.prev_line()? {
println!("{}", line);
}
// You can always start/restart reading from the end of file (EOF)
reader.eof();
println!("Last line: {}", reader.prev_line()?.unwrap());
// Or the begin of file (BOF)
reader.bof();
println!("First line: {}", reader.next_line()?.unwrap());
Ok(())
}
示例:无限读取随机行
use easy_reader::EasyReader;
use std::{
fs::File,
io::{
self,
Error
}
};
fn navigate_forever() -> Result<(), Error> {
let file = File::open("resources/test-file-lf")?;
let mut reader = EasyReader::new(file)?;
// Generate index (optional)
reader.build_index();
loop {
println!("{}", reader.random_line()?.unwrap());
}
}
依赖关系
~325KB