Rust读写CSV文件 一维Vec类型元素、二维Vec类型元素写入CSV文件

本文主要介绍Rust读写CSV文件方法, Vec类型元素基本操作方法,Rust把一维Vec类型元素、二维Vec类型元素写入CSV文件方法。

实例测试:

要求读"log.csv"文件数据,把"时间"列数据和"次数"列数据写入日志处理结果1.csv文件,把"时间"列数据写入日志处理结果2.csv文件。

log.csv文件:

日志处理结果1.csv文件:

日志处理结果2.csv文件:

实例代码

Cargo.toml添加依赖

rust 复制代码
[dependencies]
csv = "1.3.0"

main.rc文件代码

rust 复制代码
#[macro_use]
pub mod macros;
use csv::ReaderBuilder;
use csv::WriterBuilder;
use std::fs::File;
use std::str;


fn main() -> Result<(), Box<dyn std::error::Error>> {
    //创建一维Vec
    let vec_headers = Vec::from([
        "日期时间".to_string(),
        "次数".to_string(),
    ]); 

    //创建一维Vec
    let vec_headers_2 = Vec::from([
        "日期时间".to_string(),
    ]); 
    
    // 创建二维Vec
    let mut vec_matrix = Vec::new();
    //创建一维Vec
    let mut vec_date = Vec::new();  

    let input_path = "log.csv";

    /* 读取csv日志文件,并提取主要数据 */
    read_csv_file(&input_path, &mut vec_matrix, &mut vec_date).expect("Failed to read CSV file");

    /* 处理结果写入csv文件 */
    let out_path_1 = "日志处理结果1.csv";
    let _z = write_csv_file(&out_path_1, &vec_headers, &vec_matrix);
    let out_path_2 = "日志处理结果2.csv";
    let _z = write_csv_file_2(&out_path_2, &vec_headers_2,&vec_date);

    //打印等待用户按回车键,退出控制台
    println!("温馨提示:请按回车键退出......");

    // 等待用户按下回车键
    let _ = std::io::stdin().read_line(&mut String::new()).expect("TODO:panic message");
 
    Ok(())
}


/*读取csv文件,并提取主要数据 */
pub fn read_csv_file(
    path: &str,
    vec_matrix: &mut Vec<Vec<String>>,
    vec_date: &mut Vec<String>,
) -> Result<(), Box<dyn std::error::Error>> {
    let file = File::open(path)?;
    let mut reader = ReaderBuilder::new().from_reader(file);

    for result in reader.records() {
        //创建一维Vec
        let mut vec = Vec::new();

        let record = result?;
        // 处理每一行的数据
        //println!("{:?}", record);
        //println!("{:?}", record.get(0));
        //println!("{}", record.get(0).unwrap());
        vec_date.push(record.get(0).unwrap().to_string());

        vec.push(record.get(0).unwrap().to_string());
        vec.push(record.get(2).unwrap().to_string());

        //打印
        //println!("{:?}", vec);

        //添加到二维Vec
        vec_matrix.push(vec);
    }

    //打印
    println!("vec_date:");
    println!("{:?}", vec_date);
    //打印
    println!("vec_matrix包含记录{}条:", vec_matrix.len());
    for vec_item in vec_matrix.iter() {
        println!("{:?}", vec_item);
    }

    Ok(())
}

/*把二维Vec写入csv文件 */
pub fn write_csv_file(
    path: &str,
    headers: &Vec<String>,
    records: &Vec<Vec<String>>,
) -> Result<(), Box<dyn std::error::Error>> {
    let file = File::create(path)?;
    let mut writer = WriterBuilder::new().from_writer(file);

    writer.write_record(headers)?;

    for record in records {
        writer.write_record(record)?;
    }
    // 确保所有数据都被写入
    writer.flush()?;

    println!("已成功写入"{}"文件", path);

    Ok(())
}


/*把一维Vec写入csv文件 */
pub fn write_csv_file_2(
    path: &str,
    headers: &Vec<String>,
    record: &Vec<String>,
) -> Result<(), Box<dyn std::error::Error>> {
    let file = File::create(path)?;
    let mut writer = WriterBuilder::new().from_writer(file);

    writer.write_record(headers)?;

    // 遍历Vec,将每个元素作为一行写入CSV
    for item in record {
        // 将每个String元素作为单个记录写入CSV
        writer.write_record(&[&item])?;
    }
    // 确保所有数据都被写入
    writer.flush()?;

    println!("已成功写入"{}"文件", path);

    Ok(())
}

macros.rs文件代码

rust 复制代码
#[allow(unused_macros)]
#[macro_export]
macro_rules! hashmap {
    ($( $key: expr => $val: expr ),*) => {{
         let mut map = ::std::collections::HashMap::new();
         $( map.insert($key, $val); )*
         map
    }}
}

#[allow(unused_macros)]
#[macro_export]
macro_rules! hashmap_s {
    ($( $key: expr => $val: expr ),*) => {{
         let mut map = ::std::collections::HashMap::new();
         $( map.insert($key.to_string(), $val); )*
         map
    }}
}

#[macro_export]
macro_rules! vec_s {
    ($( $val: expr ),*) => {{
        let mut vec = ::std::vec::Vec::new();
        $( vec.push($val.to_string()); )*
        vec
    }}
}

#[macro_export]
macro_rules! hashset {
    ($( $val: expr ),*) => {{
        let mut vec = ::std::collections::HashSet::new();
        $( vec.insert($val); )*
        vec
    }}
}

#[macro_export]
macro_rules! hashset_s {
    ($( $val: expr ),*) => {{
        let mut vec =  ::std::collections::HashSet::new();
        $( vec.insert($val.to_string()); )*
        vec
    }}
}
运行结果:

相关推荐
xiaoye-duck8 小时前
《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
nice_lcj52010 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河6611 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
nice_lcj52015 小时前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
紧跟先前的步伐15 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
bksczm16 小时前
InnoDB 行格式详解:DYNAMIC / COMPACT / COMPRESSED / REDUNDANT
java·开发语言·数据库
春涧草茶16 小时前
慢就是快16-1协程
开发语言·前端·python
Dovis(誓平步青云)17 小时前
启元 T1 Pro 人机相声搭档:语音-触摸双通道的启元机器人节奏引擎设计
开发语言·前端·javascript·microsoft·交互
做科研的周师兄17 小时前
【R语言实战】MixSIAR 氢氧同位素水源解析全流程:从混合空间校验到贝叶斯 MCMC 收敛诊断(后附完整代码)
java·大数据·开发语言
.痞老板.18 小时前
java ee--计算机是如何工作的
java·开发语言·java-ee