当前位置: 首页 > news >正文

X-CSV-Reader:一个使用Rust实现CSV命令行读取器

🎈效果演示

csv

⚡️快速上手

  • 依赖导入:
cargo add csv
  • 读取实现:
use std::error::Error;
use std::fs::File;
use std::path::Path;fn read_csv<P: AsRef<Path>>(filename: P) -> Result<(), Box<dyn Error>> {let file = File::open(filename)?;let mut rdr = csv::Reader::from_reader(file);for result in rdr.records() {let record = result?;println!("{:?}", record);}Ok(())
}fn main() -> Result<(), Box<dyn Error>> {let filename = "src/email.csv";read_csv(filename)
}

这是一段简单的Rust程序,演示了如何使用csv``crate中的读取API,通过指定csv路径进行csv数据的读取。

  1. use std::error::Error;, use std::fs::File;, use std::path::Path;

    • 这些是Rust语言中用于导入标准库中的错误处理、文件操作和路径相关模块的语句。
  2. fn read_csv<P: AsRef<Path>>(filename: P) -> Result<(), Box<dyn Error>>

    • 这是一个函数定义,名为read_csv,它接受一个实现了AsRef<Path> trait 的泛型参数P,表示文件名。函数返回一个Result枚举类型,其中Ok(())表示成功,Err包含一个实现了Error trait 的错误对象的Box指针。
    • 函数打开指定的CSV文件,创建一个CSV读取器(csv::Reader),然后遍历文件中的每一行记录并打印出来。
  3. fn main() -> Result<(), Box<dyn Error>>

    • 这是程序的入口点,也是主函数。它也返回一个Result枚举类型,用于处理可能出现的错误。
    • main函数中,指定了要读取的CSV文件的文件名为"src/email.csv",然后调用read_csv函数来处理这个文件。
  4. let file = File::open(filename)?;

    • read_csv函数中,这行代码尝试打开指定的文件,?操作符用于处理可能出现的错误,如果出现错误,则会将错误传播到调用方。
  5. let mut rdr = csv::Reader::from_reader(file);

    • 创建一个CSV读取器rdr,并从打开的文件中读取数据。
  6. for result in rdr.records() { ... }

    • 使用for循环遍历CSV文件中的每一行记录。
  7. let record = result?;

    • 在循环中,尝试将每一行记录解析为csv::StringRecord类型的record?操作符用于处理可能的解析错误。
  8. println!("{:?}", record);

    • 打印每一行记录的内容。
  9. Ok(())

    • 在函数末尾,返回一个Ok(())表示函数执行成功。

  • 读取结果:

image-20240526192615414

csv文件的读取功能基本实现了,但是每次读取需要我们手动修改代码,指定要读取的csv文件路径,相对还是不够实用和灵活,特别是对于非程序猿来说。下面将对代码进行进一步提取和优化,将读取的功能封装为命令行程序,提升使用体验。


💥命令行程序封装

关于命令行,Rustcrate中有很多不错的库,在之前我的文章中也提及了部分,这里选择使用clap这个crate来实现。

[dependencies]
ansi_term = "0.12.1"
clap = { version = "4.5.4", features = ["derive"] }
csv = "1.3.0"
prettytable-rs = "0.10.0"
  • 结构分离,为了利于维护,将读取CSV文件的方法独立在lib.rs中,命令行参数处理等内容依旧在main.rs

  • lib.rs

pub fn read_csv<P: AsRef<Path>>(filename: P) -> Result<(), Box<dyn Error>> {let file = File::open(filename)?;let mut rdr = csv::Reader::from_reader(file);let mut table = Table::new();// 添加表头let headers = rdr.headers()?.iter().map(|h| Cell::new(h).style_spec("Fg=green")).collect();table.add_row(Row::new(headers));// 添加记录for result in rdr.records() {let record = result?;let cells: Vec<Cell> = record.iter().map(|field| Cell::new(field)).collect();table.add_row(Row::new(cells));}table.printstd();Ok(())
}

感觉没啥新的东西可以讲的,这个方法的主要逻辑在上面已经说过,至于内容的打印,还是使用之前在X-SCAN端口扫描器中使用的Table进行美化。

  • main.rs
use x_csvreader::read_csv;
#[derive(Parser, Debug)]
struct Args {#[clap(short, long, help = "The path to the CSV file.")]path: String,
}
fn print_infos() {println!("{}",Blue.paint(r#"__   __      _____  _______      __     _____                _\ \ / /     / ____|/ ____\ \    / /    |  __ \              | |\ V /_____| |    | (___  \ \  / /_____| |__) |___  __ _  __| | ___ _ __> <______| |     \___ \  \ \/ /______|  _  // _ \/ _` |/ _` |/ _ \ '__|/ . \     | |____ ____) |  \  /       | | \ \  __/ (_| | (_| |  __/ |/_/ \_\     \_____|_____/    \/        |_|  \_\___|\__,_|\__,_|\___|_|author:代号0408version:0.1.0"#));
}
fn main() {print_infos();let args = Args::parse();// 调用lib.rs中定义的read_csv函数match read_csv(&args.path) {Ok(_) => {println!("=============================");println!("CSV 文件读取成功!");}Err(e) => {eprintln!("读取 CSV 文件时出现错误:{}", e);}}
}

逻辑简单,就不赘述了。如果不了解字符打印美化和表格美化这两个lib基本使用的,建议翻下我往期的文章,都是有写的。

那么如何使用呢?

cargo run -- --path <csv文件路径>

不妨将开头的效果复现一下:

cargo run -- --path C:\RustProjects\x-csvreader\src\email.csv

当然,为了演示的效果,这里选择的CSV文件数据量并不大,处理大数据量的文件也是可以的,只不过打印出来的表格数据可能会出现终端 霸屏的情况,纸上得来终觉浅!建议你自己试试,这里就不截图了。


📃总结

这篇文章主要学习如何基于Rust使用csv这个crate构建一个CSV文件读取器的过程。学习了csv相关的用法以及一些往期学过的crate的复习,兼顾了实用性和Rust的学习,是个很不错的练手小项目。


🔖相关资源

  • clap

  • csv

  • [CSV示例文件下载地址1](可供下载的 CSV 文件 |新西兰统计局 — CSV files for download | Stats NZ)

  • [CSV示例文件下载地址2](CSV File Examples – Staffbase Support Portal)

相关文章:

X-CSV-Reader:一个使用Rust实现CSV命令行读取器

&#x1f388;效果演示 ⚡️快速上手 依赖导入&#xff1a; cargo add csv读取实现&#xff1a; use std::error::Error; use std::fs::File; use std::path::Path;fn read_csv<P: AsRef<Path>>(filename: P) -> Result<(), Box<dyn Error>> {le…...

集成ECharts到若依框架:原理与使用方法详解

ECharts 是一个强大的开源数据可视化库&#xff0c;基于 JavaScript&#xff0c;能够创建丰富多彩的图表和交互数据展示。结合若依框架&#xff08;RuoYi&#xff09;&#xff0c;我们可以非常方便地将 ECharts 集成到系统中&#xff0c;实现数据的可视化展示。本文将详细介绍 …...

【机器学习】——线性模型

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…...

最全的Redis常用命令

Redis是一个开源的内存数据结构存储系统&#xff0c;用作数据库、缓存和消息代理。它支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xff09;、列表&#xff08;lists&#xff09;、集合&#xff08;sets&#xff09…...

sourcetree推送到git上面

官网&#xff1a;Sourcetree | Free Git GUI for Mac and Windows 下载到1次提交 下载后打开 点击跳过 下一步 名字邮箱 点击clone 把自己要上传的代码粘贴到里面去 返回点击远程->点击暂存所有 加载完毕后&#xff0c;输入提交内容提交 提交完成了 2次提交 把文件夹内的…...

勒索病毒的策略与建议

随着网络技术的快速发展&#xff0c;勒索病毒攻击成为全球范围内日益严重的网络安全威胁。勒索病毒通过加密用户文件或锁定系统来勒索赎金&#xff0c;给个人和企业带来了巨大的损失。因此&#xff0c;了解如何应对勒索病毒攻击至关重要。本文将概述一些有效的防范措施和应对策…...

doxygen 1.11.0 使用详解(十四)——输出格式

目录 HTMLLATEXMan pagesRTFXMLDocBookCompiled HTML Help (a.k.a. Windows 98 help)Qt Compressed Help (.qch)Eclipse HelpXCode DocSetsPostScriptPDF The following output formats are directly supported by doxygen: HTML Generated if GENERATE_HTML is set to YES i…...

java list<AnalystEducationDO> 转成List<AnalystEducationRespVO>两个对象的属性一样

如果AnalystEducationDO和AnalystEducationRespVO两个类的属性完全相同&#xff0c;且遵循Java Bean的命名规范&#xff08;即具有相应的getter和setter方法&#xff09;&#xff0c;你可以利用一些库来简化转换过程&#xff0c;比如Apache BeanUtils或Spring Framework的BeanU…...

[Algorihm][简单多状态DP问题][买卖股票的最佳时机含冷冻期][买卖股票的最佳时机含手续费]详细讲解

目录 1.买卖股票的最佳时机含冷冻期1.题目链接买卖股票的最佳时机含冷冻期2.算法原理详解3.代码实现 2.买卖股票的最佳时机含手续费1.题目链接2.算法原理详解3.代码实现 1.买卖股票的最佳时机含冷冻期 1.题目链接 买卖股票的最佳时机含冷冻期 2.算法原理详解 思路&#xff…...

微服务:利用RestTemplate实现远程调用

打算系统学习一下微服务知识&#xff0c;从今天开始记录。 远程调用 调用order接口&#xff0c;查询。 由于实现还未封装用户信息&#xff0c;所以为null。 下面我们来使用远程调用用户服务的接口&#xff0c;然后封装一下用户信息返回即可。 流程图 配置类中注入RestTe…...

【Linux】TCP的三次握手和四次挥手

三次握手 在TCP/IP协议中&#xff0c;TCP协议提供可靠的连接服务&#xff0c;采用三次握手建立一个连接。注意&#xff01;三次握手只是用来建立连接用的&#xff0c;和TCP可靠稳定没有关系&#xff0c;TCP的可靠是通过重传和检错等机制实现的。 默认创建一个socket后&#xff…...

爬山算法全解析:掌握优化技巧,攀登技术高峰!

一、引言 爬山算法是一种局部搜索算法&#xff0c;它基于当前解的邻域中进行搜索&#xff0c;通过比较当前解与邻域解的优劣来更新当前解&#xff0c;从而逐步逼近最优解。本文将对爬山算法进行详细的介绍。 二、爬山算法简介 爬山算法是一种基于贪心策略的优化算法&#xff…...

使用 Ollama框架 下载和使用 Llama3 AI大模型的完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月24日20点59分 &#x1f004;️文章质量&#xff1a;96分 目录 &#x1f4a5;Ollama介绍 主要特点 主要优点 应…...

最新流媒体在线音乐系统网站源码| 音乐社区 | 多语言 | 开心版

最新流媒体在线音乐系统网站源码 源码免费下载地址抄笔记 (chaobiji.cn)...

中国改革报是什么级别的报刊?在哪些领域具有较高的影响力?

中国改革报是什么级别的报刊&#xff1f;在哪些领域具有较高的影响力&#xff1f; 《中国改革报》是国家发展和改革委员会主管的全国性综合类报纸。它在经济领域和改革发展方面具有重要的影响力&#xff0c;是传递国家政策、反映改革动态的重要平台。该报对于推动中国的经济改…...

乡村振兴的乡村公共服务提升:提升乡村公共服务水平,满足农民多样化需求,构建幸福美好的美丽乡村

目录 一、引言 二、乡村公共服务提升的必要性 &#xff08;一&#xff09;满足农民多样化需求 &#xff08;二&#xff09;促进乡村经济发展 &#xff08;三&#xff09;构建幸福美好的美丽乡村 三、乡村公共服务面临的挑战 &#xff08;一&#xff09;基础设施薄弱 &a…...

【在 Windows 上使用 ADB 安装 Android 设备上的 atx-agent】

在进行 Android 应用的 UI 自动化测试时&#xff0c;通常需要在设备上安装一些辅助工具。其中一个常用的工具是 atx-agent&#xff0c;它可以帮助我们在 Android 设备上进行 UI 自动化操作。本文将介绍如何在 Windows 环境下使用 ADB 安装 Android 设备上的 atx-agent。 1. 下…...

iptables 防火墙

linux防火墙基础 iptables的表&#xff0c;链结构 数据包控制的匹配流程 编写防火墙规则 基本语法&#xff0c;控制类型 添加&#xff0c;查看&#xff0c;删除规则 规则的匹配条件 iptables组件 netfilter &#xff1a;属于内核态的功能体系&#xff0c;是一个内核模块…...

软件设计师笔记1

分享一下学习软考时做的笔记&#xff0c;笔者太懒了&#xff0c;后续篇章都没咋记录&#xff0c;现在放出来水几篇文章 另外&#xff0c;本章内容都是结合教材&#xff0c;B站课堂记录。下一篇软考笔记知识点来自真题 软考笔记 第一章 1. 计算机的组成 1. 控制器 控制器由…...

springboot集成mybatis 单元测试

1、依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…...

3种方法快速上手Label Studio:终极数据标注工具完全指南

3种方法快速上手Label Studio&#xff1a;终极数据标注工具完全指南 【免费下载链接】label-studio Label Studio is a multi-type data labeling and annotation tool with standardized output format 项目地址: https://gitcode.com/GitHub_Trending/la/label-studio …...

通过Taotoken用量看板与账单追溯功能实现团队成本精细化管理

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过Taotoken用量看板与账单追溯功能实现团队成本精细化管理 对于技术团队的管理者而言&#xff0c;在引入大模型能力支持业务创新…...

DeepSeek RAG场景下的请求倾斜难题,如何用一致性哈希+请求指纹预分流实现毫秒级负载再均衡?

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek RAG场景下请求倾斜的本质与影响 在 DeepSeek RAG&#xff08;Retrieval-Augmented Generation&#xff09;系统中&#xff0c;请求倾斜并非简单的流量分布不均现象&#xff0c;而是由检索模块、向量数…...

JMeter接口测试从零到实战:新手避坑指南与自动化闭环

1. 为什么接口测试不是“点点点”&#xff0c;而JMeter是多数人绕不开的第一把刀很多人刚接触接口测试时&#xff0c;第一反应是&#xff1a;“不就是用Postman发个请求、看个返回码吗&#xff1f;还要学啥工具&#xff1f;”我带过十几批测试新人&#xff0c;八成在入职前两周…...

如何通过html-to-docx实现HTML到Word文档的精准转换:技术架构与最佳实践深度解析

如何通过html-to-docx实现HTML到Word文档的精准转换&#xff1a;技术架构与最佳实践深度解析 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 在数字化办公和企业文档处理流程中&#xff0c;HTML到Wor…...

深度解析AdvancedSessionsPlugin:构建高性能多人游戏的会话管理解决方案

深度解析AdvancedSessionsPlugin&#xff1a;构建高性能多人游戏的会话管理解决方案 【免费下载链接】AdvancedSessionsPlugin Advanced Sessions Plugin for UE4 项目地址: https://gitcode.com/gh_mirrors/ad/AdvancedSessionsPlugin AdvancedSessionsPlugin是专为虚幻…...

终极ModTheSpire指南:如何轻松为《杀戮尖塔》添加无限模组

终极ModTheSpire指南&#xff1a;如何轻松为《杀戮尖塔》添加无限模组 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire 想要让《杀戮尖塔》的爬塔体验焕然一新&#xff1f;ModTheSpire这…...

动力系统与机器学习融合:破解Sabra壳模型自相似爆破的非唯一性

1. 项目概述&#xff1a;当湍流奇点遇上动力系统与机器学习在流体动力学的世界里&#xff0c;有限时间奇点&#xff08;Blowup&#xff09;的形成一直是个迷人的谜题。想象一下&#xff0c;一个初始光滑的流体运动&#xff0c;在有限时间内&#xff0c;其速度或涡量等物理量突然…...

Windows热键冲突终极解决方案:Hotkey Detective一键检测占用程序

Windows热键冲突终极解决方案&#xff1a;Hotkey Detective一键检测占用程序 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective …...

3步掌握终极AMD Ryzen调试工具:免费解锁硬件深层控制

3步掌握终极AMD Ryzen调试工具&#xff1a;免费解锁硬件深层控制 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://git…...