我已经编写了CSV解析器,允许用户输入查询字符串和CSV文件作为位置参数,并解析查询的指定文件。
我会自动在当前目录中搜索CSV文件并在其中搜索字符串,但是我在处理这些项目并将其返回以用于其他功能时遇到问题。
我当前用于文件夹搜索的代码:
fn folder_search() {
let paths = fs::read_dir("./").unwrap();
//let mut v = Vec::new();
for path in paths {
let path = path.unwrap().path();
match path.extension() {
Some(p) if p == "csv" => println!("{:?}", path.file_name().unwrap()),
_ => (),
}
}
}
现在,我只是打印出文件扩展名。我想退回这些文件以作进一步使用,但是我不确定如何使用。
我想我可以将这些文件分配给向量,然后返回向量,但是我不确定如何将它们分配给向量。
如果我push
内的path
match path.extension() {...}
报错,提示path
的寿命不够长,据我了解,但我不知道解决此问题的正确方法是。
答案 0 :(得分:2)
Path
借用了实际的路径表示形式。您必须使用PathBuf
,它是所拥有的等效项:
use std::{ fs, io, path::PathBuf, ffi::OsStr };
fn list_of_csv_paths(root: &str) -> io::Result<Vec<PathBuf>> {
let mut result = vec![];
for path in fs::read_dir(root)? {
let path = path?.path();
if let Some("csv") = path.extension().and_then(OsStr::to_str) {
result.push(path.to_owned());
}
}
Ok(result)
}
fn main() {
println!("{:?}", list_of_csv_paths("./"));
}
我建议您使用glob
来简化工作。