首页 > 解决方案 > Rust (nom 7) 多行解析器的流版本

问题描述

我正在尝试学习 NOM,但我也是 Rust 的新手。

我有一个文本文件,每行都有单词。我想将其拆分为 2 个文件:有效的 ASCII(没有控制代码)和其他所有文件。

extern crate nom;

use std::fs::File;
use std::io::{prelude::*, BufReader};

fn main() -> std::io::Result<()>  {
    let file = File::open("/words.txt")?;
    let reader = BufReader::new(file);

    for line in reader.lines().filter_map(|result| result.ok()) {
        parse(line);
    }

    Ok(())
}

fn parse(line: String) {
    for c in line.chars() {
        if c.is_ascii_control() | !c.is_ascii() {
            println!("C> {}", line);
            return;
        }
    }
    if line.len() > 0 {
        println!("A{}> {}", line.len(), line);
    }
}

但是输入文件对于内存处理来说太大了,我应该使用 Streaming 功能,就像这样

如何修改此代码以将流缓冲区与有限容量(1000 个字符)和line_ending检查结合起来?

标签: rustnom

解决方案


推荐阅读