RustでCSVを操作する

  • 3
    いいね
  • 0
    コメント

普段の仕事(Ruby)で久しぶりにcsvを読み書きしたので、Rustでもcsvを読み書きしようと思います。
今回は rust-csvというクレートを使用します。

CSVに書き込み


extern crate csv;

fn main() {
    let people = vec![
        ("Yamada", "Taro", 1989),
        ("Sato", "Takashi", 1990),
        ("Suzuki", "Emi", 1991),
    ];
    let mut writer = csv::Writer::from_file("sample.csv").unwrap();

    for row in people {
        writer.encode(row).expect("CSV writer error");
    }
}

peopleにはcsvに書き込みたい内容を束縛します。tuple1つがcsvの1行に対応しています。from_fileの引数にはcsvを出力先(ファイルパス)を渡しています。

$ cat sample.csv
Yamada,Taro,1989
Sato,Takashi,1990
Suzuki,Emi,1991

出力したsample.csvの中身を見てみると、peopleの内容が書き込まれています。

CSVをパース

extern crate csv;

fn main() {
    let mut reader = csv::Reader::from_file("sample.csv").unwrap().has_headers(false);
    for row in reader.decode() {
        let row: (String, String, usize) = row.unwrap();
        println!("{:?}", row);
    }
}

パースも書き込みとほぼ同じです。ファイルパスを指定して、decodeするだけです。

cargo run
("Yamada", "Taro", 1989)
("Sato", "Takashi", 1990)
("Suzuki", "Emi", 1991)

CSVに書き込み(structを使用)

extern crate csv;
extern crate rustc_serialize;

#[derive(RustcEncodable)]
struct People {
    last_name: String,
    first_name: String,
    year: usize,
}

fn main() {    
    let people = People {
        last_name: "Takahashi".to_owned(),
        first_name: "Hanako".to_owned(),
        year: 1992,
    };
    let mut writer = csv::Writer::from_file("sample.csv").unwrap();

    writer.encode(people).expect("CSV writer error");
}

tupleの代わりにstructで定義したものでもcsvに出力できます。
自分で定義したデータ型をエンコードするために、rustc_serializeというクレートも使用する必要があります。

$ cat sample.csv
Takahashi,Hanako,1992
この投稿は Rust Advent Calendar 201621日目の記事です。