PR

Rust でコマンドライン引数を使いファイルを読み込む方法

1. はじめに

Rust でコマンドライン引数を使いファイルを読み込む方法です。
ファイル読み込むだけだと芸がないので、一覧から CSV ファイルを読み込んで、その内容を表示するプログラムを作成します。

2. コマンドライン引数

Rust でコマンドライン引数を取得するには、std::env::args を使います。
std::env::args は、コマンドライン引数を std::env::Args イテレータとして返します。
std::env::Args は、std::iter::Iterator トレイトを実装しているので、for ループで値を取得できます。

use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();
    for arg in args {
        println!("{}", arg);
    }
}

上記のプログラムを実行すると、以下のようにコマンドライン引数が表示されます。

$ cargo run --release -- -a -b -c
target/release/args
--release
-a
-b
-c

コマンドライン引数の不足や過剰をチェックするには、std::env::args の返り値を Vec に変換して、要素数をチェックします。

use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();

    if args.len() < 5 {
        eprintln!("Usage: {} <arg1> <arg2> <arg3> <arg4>", args[0]);
        std::process::exit(1);
    }
}

3. ディレクトリ内のファイル一覧を取得

ディレクトリ内のファイル一覧を取得するには、std::fs::read_dir を使います。
std::fs::read_dir は、指定されたディレクトリ内のエントリを返すイテレータを返します。
std::fs::read_dir の返り値は、std::fs::ReadDir イテレータです。

use std::fs;

fn main() {
    let dir = fs::read_dir(".").unwrap();
    for entry in dir {
        let entry = entry.unwrap();
        let path = entry.path();
        println!("{}", path.display());
    }
}

4. CSV ファイルを読み込む

CSV ファイルを読み込むには、csv クレートを使います。
csv クレートは、CSV ファイルを読み込むための機能を提供します。

Cargo.tomlcsv クレートを追加します。

[dependencies]
csv = "1.1.6"

以下のプログラムは、CSV ファイルを読み込んで、その内容を表示します。
注意点として、CSV ファイルの文字コードが UTF-8 でない場合は、std::fs::File でファイルを開いて、std::io::BufReader でラップして、encoding_rs クレートで文字コードを変換する必要があります。

use std:fs;
use encoding_rs;
use csv;

fn main() {
    let file = fs::read("data.csv").unwrap();
    let (decoded, _, _) = encoding_rs::SHIFT_JIS.decode(&file);
    let mut reader = csv::Reader::from_reader(decoded.as_bytes());
    for result in reader.records() {
        let record = result.unwrap();
        println!("{:?}", record);
    }
}

5. まとめ

Rust でコマンドライン引数を使いファイルを読み込む方法について説明しました。
今回の記事も、Github Copilot が9割くらい書いてくれました。
添削だけで済むので、楽ですね。

A. 参考サイト

引数処理
Rust でディレクトリ内のファイルを列挙する
ファイルを読み込む
rustで非UTF-8のcsvファイルを読み込む

B. 参考書籍

コメント