#file-line #line #backward #random #reader #reverse #read-file

easy_reader

A Rust库,可轻松遍历大文件的行,向前、向后或随机读取行,无需使用迭代器。

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 文本处理

Download history 1215/week @ 2024-03-13 690/week @ 2024-03-20 579/week @ 2024-03-27 780/week @ 2024-04-03 462/week @ 2024-04-10 752/week @ 2024-04-17 681/week @ 2024-04-24 969/week @ 2024-05-01 821/week @ 2024-05-08 903/week @ 2024-05-15 834/week @ 2024-05-22 1164/week @ 2024-05-29 969/week @ 2024-06-05 759/week @ 2024-06-12 950/week @ 2024-06-19 933/week @ 2024-06-26

3,845 个月下载量
3 个包中使用(2 个直接使用)

Apache-2.0

69KB
733

EasyReader

Build Status Latest Version Documentation Rustc Version

此库的主要目标是允许用户在大型文件的行之间进行长距离导航,自由地前后移动或获取随机行,而无需消耗迭代器。

目前,通过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