Rust程序读取CSV文件时始终提示‘无此文件或目录’问题
Rust CSV读取文件未找到错误排查与修复
核心问题原因
- 硬编码路径导致文件找不到:
main函数中直接使用硬编码的字符串"path to file"作为文件路径,完全忽略了命令行传入的参数。无论运行时传递什么文件名,程序都会尝试打开这个不存在的路径,必然触发No such file or directory错误。 - 隐藏的数值解析错误:CSV的
Close/Last、Open等列带有$前缀,直接调用parse()会失败,后续运行会触发解析panic。
解决方法
1. 读取命令行参数替换硬编码路径
使用std::env::args()获取运行时传入的文件名,确保程序使用用户指定的文件路径。
2. 处理CSV中的货币符号
在解析数值前,先去除字符串中的$字符,确保parse()能正常转换为浮点数。
3. 优化错误处理(可选)
替换unwrap()为?操作符或显式错误处理,避免程序直接panic,提升鲁棒性。
修正后的完整代码
extern crate csv; use std::error::Error; use std::env; use csv::StringRecord; #[derive(Debug)] struct DataFrame { header: csv::StringRecord, date: Vec<String>, close: Vec<f32>, volume: Vec<f32>, // 修正拼写错误:volumn -> volume open: Vec<f32>, high: Vec<f32>, low: Vec<f32>, } impl DataFrame { fn new() -> DataFrame { DataFrame { header: csv::StringRecord::new(), date: Vec::new(), close: Vec::new(), volume: Vec::new(), open: Vec::new(), high: Vec::new(), low: Vec::new(), } } // 改为返回Result,优化错误处理 fn read_csv(filepath: &str, has_headers: bool) -> Result<Self, Box<dyn Error>> { let file = std::fs::File::open(filepath)?; let mut rdr = csv::ReaderBuilder::new() .has_headers(has_headers) .from_reader(file); let mut data_frame = DataFrame::new(); // 读取并保存表头 if has_headers { data_frame.header = rdr.headers()?.clone(); } for result in rdr.records() { let record = result?; data_frame.push(&record)?; } Ok(data_frame) } // 改为返回Result,处理解析错误 fn push(&mut self, row: &csv::StringRecord) -> Result<(), Box<dyn Error>> { self.date.push(row[0].to_string()); // 去除$符号后解析 let close_val = row[1].trim_start_matches('$').parse()?; self.close.push(close_val); let volume_val = row[2].parse()?; self.volume.push(volume_val); let open_val = row[3].trim_start_matches('$').parse()?; self.open.push(open_val); let high_val = row[4].trim_start_matches('$').parse()?; self.high.push(high_val); let low_val = row[5].trim_start_matches('$').parse()?; self.low.push(low_val); Ok(()) } } fn main() -> Result<(), Box<dyn Error>> { // 获取命令行参数,第一个参数是程序名,第二个是文件名 let args: Vec<String> = env::args().collect(); if args.len() < 2 { eprintln!("用法: {} <csv文件名>", args[0]); std::process::exit(1); } let filepath = &args[1]; let data = DataFrame::read_csv(filepath, true)?; println!("{:?}", data); Ok(()) }
验证步骤
- 确保CSV文件
HistoricalData_1661097361659.csv在当前运行目录(~/rust/vectors/target/debug)下。 - 运行命令:
./vectors HistoricalData_1661097361659.csv
此时程序会正确读取CSV文件并输出解析后的DataFrame内容。
内容的提问来源于stack exchange,提问作者D.Zou
相关产品推荐
相关产品推荐

