最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2024年05月28日 09:50:59   作者:代號0408  
這篇文章主要學(xué)習(xí)如何基于Rust使用csv這個crate構(gòu)建一個CSV文件讀取器的過程,學(xué)習(xí)了csv相關(guān)的用法以及一些往期學(xué)過的crate的復(fù)習(xí),兼顧了實(shí)用性和Rust的學(xué)習(xí),需要的朋友可以參考下

效果演示

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)
}

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

讀取結(jié)果:

image-20240526192615414

csv文件的讀取功能基本實(shí)現(xiàn)了,但是每次讀取需要我們手動修改代碼,指定要讀取的csv文件路徑,相對還是不夠?qū)嵱煤挽`活,特別是對于非程序猿來說。下面將對代碼進(jìn)行進(jìn)一步提取和優(yōu)化,將讀取的功能封裝為命令行程序,提升使用體驗(yàn)。

命令行程序封裝

關(guān)于命令行,Rustcrate中有很多不錯的庫,在之前我的文章中也提及了部分,這里選擇使用clap這個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(())
}

感覺沒啥新的東西可以講的,這個方法的主要邏輯在上面已經(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:代號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 文件時出現(xiàn)錯誤:{}", e);
        }
    }
}

邏輯簡單,就不贅述了。如果不了解字符打印美化和表格美化這兩個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ù)可能會出現(xiàn)終端 霸屏的情況,紙上得來終覺淺!建議你自己試試,這里就不截圖了。

總結(jié)

這篇文章主要學(xué)習(xí)如何基于Rust使用csv這個crate構(gòu)建一個CSV文件讀取器的過程。學(xué)習(xí)了csv相關(guān)的用法以及一些往期學(xué)過的crate的復(fù)習(xí),兼顧了實(shí)用性和Rust的學(xué)習(xí),是個很不錯的練手小項(xiàng)目。

以上就是Rust使用csv crate構(gòu)建CSV文件讀取器的全過程的詳細(xì)內(nèi)容,更多關(guān)于Rust CSV文件讀取器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • rust實(shí)現(xiàn)post小程序(完整代碼)

    rust實(shí)現(xiàn)post小程序(完整代碼)

    這篇文章主要介紹了rust實(shí)現(xiàn)一個post小程序,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • 一文學(xué)會Rust語言如何操作JSON

    一文學(xué)會Rust語言如何操作JSON

    JSON在Web開發(fā)中被廣泛應(yīng)用于數(shù)據(jù)交換,本文主要介紹了Rust語言操作JSON,包括序列化、反序列化、JSON創(chuàng)建等多個方面,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • 使用vscode配置Rust運(yùn)行環(huán)境全過程

    使用vscode配置Rust運(yùn)行環(huán)境全過程

    VS Code對Rust有著較完備的支持,這篇文章主要給大家介紹了關(guān)于使用vscode配置Rust運(yùn)行環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Rust的slab庫使用場景分析

    Rust的slab庫使用場景分析

    slab 是一個輕量級、高性能的工具,非常適合管理固定大小的資源集合,尤其是在網(wǎng)絡(luò)編程和事件驅(qū)動架構(gòu)中,這篇文章主要介紹了Rust的slab庫使用教程,需要的朋友可以參考下
    2024-12-12
  • Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解

    Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解

    這篇文章主要為大家介紹了Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Rust 中判斷兩個 HashMap 是否相等

    Rust 中判斷兩個 HashMap 是否相等

    在Rust標(biāo)準(zhǔn)庫中,HashMap 實(shí)現(xiàn)了 PartialEq 和 Eq trait,但是這些trait的實(shí)現(xiàn)是基于嚴(yán)格的結(jié)構(gòu)相等性,包括元素的順序,這篇文章主要介紹了Rust 中判斷兩個 HashMap 是否相等,需要的朋友可以參考下
    2024-04-04
  • Rust 入門之函數(shù)和注釋實(shí)例詳解

    Rust 入門之函數(shù)和注釋實(shí)例詳解

    這篇文章主要為大家介紹了Rust 入門之函數(shù)和注釋實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 一步到位,教你如何在Windows成功安裝Rust

    一步到位,教你如何在Windows成功安裝Rust

    一步到位:輕松學(xué)會在Windows上安裝Rust!想快速掌握Rust編程語言?別再為復(fù)雜教程頭疼!這份指南將手把手帶你順利完成Windows平臺上的Rust安裝全過程,從此編碼之旅更加順暢無阻,立即閱讀,開始你的Rust編程旅程吧!
    2024-01-01
  • Rust中vector的詳細(xì)用法

    Rust中vector的詳細(xì)用法

    Rust和C++同樣也有vector概念,本文主要介紹了Rust中vector的詳細(xì)用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Rust標(biāo)量類型的具體使用

    Rust標(biāo)量類型的具體使用

    本文主要介紹了Rust標(biāo)量類型的具體使用,其中包括整數(shù)類型、浮點(diǎn)類型、布爾類型以及字符類型,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03

最新評論

江孜县| 乐陵市| 樟树市| 集贤县| 宜宾市| 刚察县| 新昌县| 南乐县| 资兴市| 寿阳县| 安顺市| 广平县| 岳西县| 阳高县| 方山县| 巨野县| 建水县| 德惠市| 西平县| 延安市| 万全县| 朝阳区| 台前县| 拜泉县| 明光市| 寿阳县| 洛南县| 武邑县| 高青县| 阳新县| 花莲县| 库尔勒市| 辽阳县| 霍邱县| 麻城市| 宜都市| 池州市| 长宁县| 夏津县| 兰考县| 宁国市|