You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(())
}

验证步骤

  1. 确保CSV文件HistoricalData_1661097361659.csv在当前运行目录(~/rust/vectors/target/debug)下。
  2. 运行命令:
./vectors HistoricalData_1661097361659.csv

此时程序会正确读取CSV文件并输出解析后的DataFrame内容。

内容的提问来源于stack exchange,提问作者D.Zou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:06:47