Rust使用csv crate構(gòu)建CSV文件讀取器的全過程
效果演示

快速上手
依賴導(dǎo)入:
cargo add csv
讀取實(shí)現(xiàn):
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)
}
這是一段簡(jiǎn)單的
Rust程序,演示了如何使用csv``crate中的讀取API,通過指定csv路徑進(jìn)行csv數(shù)據(jù)的讀取。
use std::error::Error;,use std::fs::File;,use std::path::Path;:- 這些是Rust語言中用于導(dǎo)入標(biāo)準(zhǔn)庫中的錯(cuò)誤處理、文件操作和路徑相關(guān)模塊的語句。
fn read_csv<P: AsRef<Path>>(filename: P) -> Result<(), Box<dyn Error>>:- 這是一個(gè)函數(shù)定義,名為
read_csv,它接受一個(gè)實(shí)現(xiàn)了AsRef<Path>trait 的泛型參數(shù)P,表示文件名。函數(shù)返回一個(gè)Result枚舉類型,其中Ok(())表示成功,Err包含一個(gè)實(shí)現(xiàn)了Errortrait 的錯(cuò)誤對(duì)象的Box指針。 - 函數(shù)打開指定的CSV文件,創(chuàng)建一個(gè)CSV讀取器(
csv::Reader),然后遍歷文件中的每一行記錄并打印出來。
- 這是一個(gè)函數(shù)定義,名為
fn main() -> Result<(), Box<dyn Error>>:- 這是程序的入口點(diǎn),也是主函數(shù)。它也返回一個(gè)
Result枚舉類型,用于處理可能出現(xiàn)的錯(cuò)誤。 - 在
main函數(shù)中,指定了要讀取的CSV文件的文件名為"src/email.csv",然后調(diào)用read_csv函數(shù)來處理這個(gè)文件。
- 這是程序的入口點(diǎn),也是主函數(shù)。它也返回一個(gè)
let file = File::open(filename)?;:- 在
read_csv函數(shù)中,這行代碼嘗試打開指定的文件,?操作符用于處理可能出現(xiàn)的錯(cuò)誤,如果出現(xiàn)錯(cuò)誤,則會(huì)將錯(cuò)誤傳播到調(diào)用方。
- 在
let mut rdr = csv::Reader::from_reader(file);:- 創(chuàng)建一個(gè)CSV讀取器
rdr,并從打開的文件中讀取數(shù)據(jù)。
- 創(chuàng)建一個(gè)CSV讀取器
for result in rdr.records() { ... }:- 使用
for循環(huán)遍歷CSV文件中的每一行記錄。
- 使用
let record = result?;:- 在循環(huán)中,嘗試將每一行記錄解析為
csv::StringRecord類型的record,?操作符用于處理可能的解析錯(cuò)誤。
- 在循環(huán)中,嘗試將每一行記錄解析為
println!("{:?}", record);:- 打印每一行記錄的內(nèi)容。
Ok(()):- 在函數(shù)末尾,返回一個(gè)
Ok(())表示函數(shù)執(zhí)行成功。
- 在函數(shù)末尾,返回一個(gè)
讀取結(jié)果:

csv文件的讀取功能基本實(shí)現(xiàn)了,但是每次讀取需要我們手動(dòng)修改代碼,指定要讀取的csv文件路徑,相對(duì)還是不夠?qū)嵱煤挽`活,特別是對(duì)于非程序猿來說。下面將對(duì)代碼進(jìn)行進(jìn)一步提取和優(yōu)化,將讀取的功能封裝為命令行程序,提升使用體驗(yàn)。
命令行程序封裝
關(guān)于命令行,Rust的crate中有很多不錯(cuò)的庫,在之前我的文章中也提及了部分,這里選擇使用clap這個(gè)crate來實(shí)現(xiàn)。
[dependencies]
ansi_term = "0.12.1"
clap = { version = "4.5.4", features = ["derive"] }
csv = "1.3.0"
prettytable-rs = "0.10.0"
結(jié)構(gòu)分離,為了利于維護(hù),將讀取CSV文件的方法獨(dú)立在lib.rs中,命令行參數(shù)處理等內(nèi)容依舊在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(())
}
感覺沒啥新的東西可以講的,這個(gè)方法的主要邏輯在上面已經(jīng)說過,至于內(nèi)容的打印,還是使用之前在X-SCAN端口掃描器中使用的Table進(jìn)行美化。
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:代號(hào)0408
version:0.1.0
"#
)
);
}
fn main() {
print_infos();
let args = Args::parse();
// 調(diào)用lib.rs中定義的read_csv函數(shù)
match read_csv(&args.path) {
Ok(_) => {
println!("=============================");
println!("CSV 文件讀取成功!");
}
Err(e) => {
eprintln!("讀取 CSV 文件時(shí)出現(xiàn)錯(cuò)誤:{}", e);
}
}
}
邏輯簡(jiǎn)單,就不贅述了。如果不了解字符打印美化和表格美化這兩個(gè)
lib基本使用的,建議翻下我往期的文章,都是有寫的。
那么如何使用呢?
cargo run -- --path <csv文件路徑>
不妨將開頭的效果復(fù)現(xiàn)一下:
cargo run -- --path C:\RustProjects\x-csvreader\src\email.csv

當(dāng)然,為了演示的效果,這里選擇的CSV文件數(shù)據(jù)量并不大,處理大數(shù)據(jù)量的文件也是可以的,只不過打印出來的表格數(shù)據(jù)可能會(huì)出現(xiàn)終端 霸屏的情況,紙上得來終覺淺!建議你自己試試,這里就不截圖了。
總結(jié)
這篇文章主要學(xué)習(xí)如何基于Rust使用csv這個(gè)crate構(gòu)建一個(gè)CSV文件讀取器的過程。學(xué)習(xí)了csv相關(guān)的用法以及一些往期學(xué)過的crate的復(fù)習(xí),兼顧了實(shí)用性和Rust的學(xué)習(xí),是個(gè)很不錯(cuò)的練手小項(xiàng)目。
以上就是Rust使用csv crate構(gòu)建CSV文件讀取器的全過程的詳細(xì)內(nèi)容,更多關(guān)于Rust CSV文件讀取器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go調(diào)用Rust方法及外部函數(shù)接口前置
這篇文章主要為大家介紹了Go調(diào)用Rust方法及外部函數(shù)接口前置示例實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

