【问题标题】:How to simplify parsing a text file to a vector of values?如何简化将文本文件解析为值向量?
【发布时间】:2015-03-27 10:11:09
【问题描述】:

我是 Rust 新手,我正在尝试找到最简单有效的解析文本文件的方法,例如:

1
2
3
4
5

到我的代码中的 u32 向量。现在我有一个将文件作为字符串读取的解决方案(它正好来自 rustbyexample.com,我做了一点改动):

let path = Path::new("J:/IntegerArray.txt");
let display = path.display();

let mut file = match File::open(&path)
{
    Err(why) => panic!("couldn't open {}: {}", display, why.desc),
    Ok(file) => file,
};

let data_str = match file.read_to_string()
{
    Err(why) => panic!("couldn't read {}: {}", display, why.desc),
    Ok(string) =>
    {
        string
    }
};

然后我解析它:

let mut data : Vec<u32> = vec![];

for str in data_str.lines_any()
{
    data.push(match str.trim().parse() { Some(x) => x, None => continue, } );
}

但是我认为有一种解决方案可以在没有循环的情况下在一行中完成,例如:

let mut data : Vec<u32> = data_str.lines_any().<SOME MAGIC>.collect();

也许可以用 map 和 filter 来完成,但主要问题在于将 Option 解包到 u32,因为我看不到如何过滤掉 Nones 并同时解包到 u32。否则,仅过滤而不展开会导致进一步检查它们。单线解决方案可行吗?它会是一个有效的解决方案吗?

【问题讨论】:

    标签: rust


    【解决方案1】:

    filter_map 就是你要找的东西:

    let data: Vec<u32> = data_str.lines_any().filter_map(|s| s.trim().parse()).collect();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 2016-12-07
      相关资源
      最近更新 更多