X-CSV-Reader:一个使用Rust实现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
数据的读取。
-
use std::error::Error;
,use std::fs::File;
,use std::path::Path;
:- 这些是Rust语言中用于导入标准库中的错误处理、文件操作和路径相关模块的语句。
-
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
),然后遍历文件中的每一行记录并打印出来。
- 这是一个函数定义,名为
-
fn main() -> Result<(), Box<dyn Error>>
:- 这是程序的入口点,也是主函数。它也返回一个
Result
枚举类型,用于处理可能出现的错误。 - 在
main
函数中,指定了要读取的CSV文件的文件名为"src/email.csv"
,然后调用read_csv
函数来处理这个文件。
- 这是程序的入口点,也是主函数。它也返回一个
-
let file = File::open(filename)?;
:- 在
read_csv
函数中,这行代码尝试打开指定的文件,?
操作符用于处理可能出现的错误,如果出现错误,则会将错误传播到调用方。
- 在
-
let mut rdr = csv::Reader::from_reader(file);
:- 创建一个CSV读取器
rdr
,并从打开的文件中读取数据。
- 创建一个CSV读取器
-
for result in rdr.records() { ... }
:- 使用
for
循环遍历CSV文件中的每一行记录。
- 使用
-
let record = result?;
:- 在循环中,尝试将每一行记录解析为
csv::StringRecord
类型的record
,?
操作符用于处理可能的解析错误。
- 在循环中,尝试将每一行记录解析为
-
println!("{:?}", record);
:- 打印每一行记录的内容。
-
Ok(())
:- 在函数末尾,返回一个
Ok(())
表示函数执行成功。
- 在函数末尾,返回一个
- 读取结果:
csv
文件的读取功能基本实现了,但是每次读取需要我们手动修改代码,指定要读取的csv
文件路径,相对还是不够实用和灵活,特别是对于非程序猿来说。下面将对代码进行进一步提取和优化,将读取的功能封装为命令行程序,提升使用体验。
💥命令行程序封装
关于命令行,Rust
的crate
中有很多不错的库,在之前我的文章中也提及了部分,这里选择使用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命令行读取器
🎈效果演示 ⚡️快速上手 依赖导入: 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>> {le…...
集成ECharts到若依框架:原理与使用方法详解
ECharts 是一个强大的开源数据可视化库,基于 JavaScript,能够创建丰富多彩的图表和交互数据展示。结合若依框架(RuoYi),我们可以非常方便地将 ECharts 集成到系统中,实现数据的可视化展示。本文将详细介绍 …...

【机器学习】——线性模型
💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux…...
最全的Redis常用命令
Redis是一个开源的内存数据结构存储系统,用作数据库、缓存和消息代理。它支持多种类型的数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)…...

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

勒索病毒的策略与建议
随着网络技术的快速发展,勒索病毒攻击成为全球范围内日益严重的网络安全威胁。勒索病毒通过加密用户文件或锁定系统来勒索赎金,给个人和企业带来了巨大的损失。因此,了解如何应对勒索病毒攻击至关重要。本文将概述一些有效的防范措施和应对策…...
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两个类的属性完全相同,且遵循Java Bean的命名规范(即具有相应的getter和setter方法),你可以利用一些库来简化转换过程,比如Apache BeanUtils或Spring Framework的BeanU…...

[Algorihm][简单多状态DP问题][买卖股票的最佳时机含冷冻期][买卖股票的最佳时机含手续费]详细讲解
目录 1.买卖股票的最佳时机含冷冻期1.题目链接买卖股票的最佳时机含冷冻期2.算法原理详解3.代码实现 2.买卖股票的最佳时机含手续费1.题目链接2.算法原理详解3.代码实现 1.买卖股票的最佳时机含冷冻期 1.题目链接 买卖股票的最佳时机含冷冻期 2.算法原理详解 思路ÿ…...

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

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

爬山算法全解析:掌握优化技巧,攀登技术高峰!
一、引言 爬山算法是一种局部搜索算法,它基于当前解的邻域中进行搜索,通过比较当前解与邻域解的优劣来更新当前解,从而逐步逼近最优解。本文将对爬山算法进行详细的介绍。 二、爬山算法简介 爬山算法是一种基于贪心策略的优化算法ÿ…...

使用 Ollama框架 下载和使用 Llama3 AI大模型的完整指南
🏡作者主页:点击! 🤖AI大模型部署与应用专栏:点击! ⏰️创作时间:2024年5月24日20点59分 🀄️文章质量:96分 目录 💥Ollama介绍 主要特点 主要优点 应…...

最新流媒体在线音乐系统网站源码| 音乐社区 | 多语言 | 开心版
最新流媒体在线音乐系统网站源码 源码免费下载地址抄笔记 (chaobiji.cn)...

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

乡村振兴的乡村公共服务提升:提升乡村公共服务水平,满足农民多样化需求,构建幸福美好的美丽乡村
目录 一、引言 二、乡村公共服务提升的必要性 (一)满足农民多样化需求 (二)促进乡村经济发展 (三)构建幸福美好的美丽乡村 三、乡村公共服务面临的挑战 (一)基础设施薄弱 &a…...
【在 Windows 上使用 ADB 安装 Android 设备上的 atx-agent】
在进行 Android 应用的 UI 自动化测试时,通常需要在设备上安装一些辅助工具。其中一个常用的工具是 atx-agent,它可以帮助我们在 Android 设备上进行 UI 自动化操作。本文将介绍如何在 Windows 环境下使用 ADB 安装 Android 设备上的 atx-agent。 1. 下…...

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

软件设计师笔记1
分享一下学习软考时做的笔记,笔者太懒了,后续篇章都没咋记录,现在放出来水几篇文章 另外,本章内容都是结合教材,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…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...