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.toml
に csv
クレートを追加します。
[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ファイルを読み込む
コメント