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添加依赖

[dependencies]
csv = "1.3.0"

main.rc文件代码

#[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文件代码

#[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
    }}
}


运行结果

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/615523.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++相关概念和易错语法(12)(迭代器、string容量调整)

1.迭代器&#xff08;以string为例&#xff09; &#xff08;1&#xff09;基本理解&#xff1a;在我们刚接触迭代器的时候&#xff0c;我们可以将迭代器理解为改造过的“指针”&#xff0c;这是一个新的类型&#xff0c;指向对应容器中的各个元素。我们可以像指针那样对迭代器…

算法详解——回溯法

一、回溯法概述——问题背景 回溯法是一种解决约束满足问题的方法&#xff0c;特别适用于解决组合问题、搜索优化问题等。它通过逐步构建候选解决方案并且在这个解决方案不再可能满足约束或条件时进行剪枝和回溯。具体来说&#xff0c;回溯法可以应用于以下类型的问题&#xff…

Windows10搭建GPU版Darknet—yolov4—VS2022+CUDA+CUDNN(亲测有效)

1 VS2019安装 网址&#xff1a;Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 下载完成之后双击.exe文件 步骤严格如下安装 默认语音包为中文&#xff08;简体&#xff09; 安装位置可以自行选择&#xff0c;完成以后就可以点击安装了。 安装完毕以后需要重启…

如何设置cPanel的自动备份

近期我们购买了Hostease美国VPS云主机产品&#xff0c;由于需要设置服务器的自动备份&#xff0c;我们向Hostease技术团队进行了咨询&#xff0c;他们提到VPS云主机的cPanel面板包含自动备份功能&#xff0c;下面我们就介绍如何进行自动备份的设置。 首先你需要登录到WHM面板&a…

暗区突围PC测试资格获取教程 人人可领100%获取方法

暗区突围PC测试资格获取教程 人人可领100%获取方法 暗区突围国际服的上线&#xff0c;近日在游戏圈内掀起了不小的浪花。而一个暗区突围国际服的测试资格更是成为了玩家们眼中炙手可热的宝物。许多玩家不知道该如何获取游戏的测试资格&#xff0c;今天小编就为大家带来详细的教…

电脑复制和粘贴的时候会出现Hello!

电脑不管是Microsoft Excel还是Microsoft Word复制之后粘贴过来就出现HELLO&#xff0c;当复制粘贴文件的时候就会出现WINFILE&#xff1b; 具体现象看下面两个图片&#xff1a; 这是因为winfile 文件病毒&#xff08;幽灵蠕虫病毒&#xff09;,每月的28号发作&#xff1b; 症状…

【深度学习】YOLO源码中的mAP计算代码的理解笔记(大部分代码逐行+基础解释)

提示&#xff1a;本篇博客是在阅读了YOLO源码中的mAP计算方法的代码后加上官方解释以及自己的debug调试理解每一步是怎么操作的。由于是大部分代码进行了逐行解释&#xff0c;所以篇幅过长。 文章目录 前言一、输入格式处理1.1 转换公式二、init&#xff1a;初始化2.1 iouv2.2 …

2024版本idea集成SpringBoot + Ai 手写一个chatgpt 【推荐】

题目&#xff1a;SpringBoot OpenAi 在这里获取key和url&#xff1a;获取免费key base-url为这两个&#xff1a; 话不多说直接来&#xff01; 一、简介 Spring AI 是 AI 工程的应用框架。其目标是将 Spring 生态系统设计原则&#xff08;如可移植性和模块化设计&#xff…

【CAD建模号】学习笔记(四):工作平面

工作平面介绍 CAD建模号右侧导航栏提供了很多便捷的工具&#xff0c;有测量工具、坐标系、模型和图层切换、视图切换等。 1. 测量工具组 测量工具可以测量图形的几何体积&#xff0c;长度&#xff0c;角度等。工具组包含如下&#xff1a; 测量几何&#xff1a;可以测量图形的面…

C++多态实现原理详解

阅读引言&#xff1a; 我想象了一下&#xff0c; 假如人有突然问我什么是多态&#xff0c; 我该如何给别人说清楚呢&#xff1f;所以写下这篇文章&#xff0c; 希望大家看完有所收获。 ①. 开胃小菜 先看这样一个开胃小菜 这里我有点小小的疑惑&#xff0c; 大小为啥是1。 在C…

即插即用篇 | YOLOv8引入局部自注意力 HaloAttention | 为参数高效的视觉主干网络扩展局部自注意力

本改进已集成到 YOLOv8-Magic 框架。 我们提出了Axial Transformers,这是一个基于自注意力的自回归模型,用于图像和其他组织为高维张量的数据。现有的自回归模型要么因高维数据的计算资源需求过大而受到限制,要么为了减少资源需求而在分布表达性或实现的便捷性上做出妥协。相…

【知识碎片】2024_05_11

本篇记录了两个代码&#xff0c;【图片整理】是一个数组排序题&#xff0c;【寻找数组的中心下标】看起来很适合用双指针&#xff0c;但是细节多&#xff0c;最后还是没通过全部用例&#xff0c;看了题解写出来的。 C语言部分是两个知道错了之后恍然大悟的选择题。 每日代码 图…

1053: 输出利用先序遍历创建的二叉树中的指定结点的度

解法&#xff1a; c语言 #include<iostream> #include<vector> using namespace std; typedef struct tNodes{char val;tNodes* left, * right; }* tNode;void creat(tNode& t) {char ch;cin >> ch;if (ch #) t NULL;else {t new tNodes;t->val …

最少数量线段覆盖-华为OD

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布一些解题思路&#xff0c;希望大家多指教 一、题目描述 给定坐标轴上的一组线段&#xff0c;线段的起点和终点均为整数…

完整性验证器:迈向 Starknet 超高可扩展性的一大步

原文&#xff1a;https://www.starknet.io/en/content/the-integrity-verifier-a-leap-toward-starknet-hyperscaling&#xff1b;https://www.starknet.io/en/ecosystem/grant 编译&#xff1a;TinTinLand 核心观点 由 Herodotus 开发的完整性验证器&#xff0c;使开发者能够…

代码随想录算法训练营第六十三天| LeetCode84. 柱状图中最大的矩形

一、LeetCode 84. 柱状图中最大的矩形 题目链接/文章讲解/代码讲解&#xff1a;https://programmercarl.com/0084.%E6%9F%B1%E7%8A%B6%E5%9B%BE%E4%B8%AD%E6%9C%80%E5%A4%A7%E7%9A%84%E7%9F%A9%E5%BD%A2.html 状态&#xff1a;已解决 1.思路 这道题跟上道接雨水的题基本上是反…

【MySQL】锁

锁 全局锁 全局锁&#xff1a;对整个数据库实例加锁&#xff0c;加锁后整个实例就处于只读状态&#xff0c;其他语句都将被阻塞。 使用场景是&#xff1a;全库的逻辑备份 语法&#xff1a; 1、加全局锁 flush tables with read lock ;2、数据备份 mysqldump -uroot –pr…

【Web后端】web后端开发简介_Servlet简介

1.web后端开发简介 Java企业级开发&#xff0c;也就是学习]avaEE(Enterprise Edition)版本,是一种结构和一套标准。在应用中开发的标准就是Servlet、jsp和JavaBean技术。jsp技术现在已基本处于淘汰状态&#xff0c;简单了解即可web后端开发&#xff0c;基于B/S模式的开发体系。…

系分-历年论文题目

年份试题一试题二试题三试题四2023年信息系统数据转换与迁移敏捷开发方法论Devops及其应用论信息系统可行性分析2022年论原型法及其在信息系统开发中的应用论面向对象设计方法及其应用2021年论面向对象的信息系统分析方法论静态测试方法及其应用论富互联网应用的客户端开发技术…

13、FreeRTOS 事件标志组

文章目录 一、事件组(event group)的特性1.1 什么是事件标注组1.2 事件标注组的场景1.3 事件组的概念1.4 事件组的操作 二、事件组API2.1 创建2.2 删除2.3 设置事件2.4 等待事件2.5 同步点 一、事件组(event group)的特性 1.1 什么是事件标注组 事件标志位&#xff1a;表明某…