Tagebuch von Spargel

最近zennに移行しましたhttps://zenn.dev/spargel

rustで非UTF-8のcsvファイルを読み込む

csvファイルの読み込みで少し嵌ったのでメモ.

結論

一度Vecで読み込んでからUTF-8にencodeして,csvとして読み込む.

csvencoding_rsクレートを使用.

Cargo.toml :

[dependencies]
csv = "1.1.6"
encoding_rs = "0.8.29"

main.rs :

extern crate csv;

use encoding_rs;
use std::error::Error;
use std::process;
use std::fs;


fn run() -> Result<(), Box<dyn Error>> {
    let file_path = "hogehoge.csv";
    let file = fs::read(file_path).unwrap();
    let (res, _, _) = encoding_rs::SHIFT_JIS.decode(&file);
    let mut rdr = csv::Reader::from_reader(res.as_bytes());
    for result in rdr.records() {
        let record = result?;
        println!("{:?}", record(1));
    }
    Ok(())
}


fn main() {
    if let Err(err) = run() {
        println!("{}", err);
        process::exit(1);
    }
}

環境

cargo: v1.55.0

rustc: v1.55.0

その他

もっと効率の良い書き方,高速な書き方ご存知でしたら教えてください.

参考文献

[Rust] Shift_JISをUTF-8に変換する - Qiita

【翻訳】RustとCSV解析(csv crateチュートリアル):前編 - Read -> Blog