質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

641閲覧

Rustを使ってcsvファイルを途中から読み込みたい

Noty0615

総合スコア12

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2022/07/24 17:36

編集2022/07/25 01:20

実現したいこと

Rustを用いて以下のcsvファイルの読み込みたいです。
3行目以降の情報が必要ですが、エラーのためうまく動いていません。
「csvの途中から読み取る方法」や「規則が変わるcsvの読み取る方法」等わかる方がいましたら、アドバイスいただけると幸いです。

test.csv

1[年度],2022年度,[学期],1, 2[テスト名],中間テスト,[学年],3年, 3姓,名,点数, 4AA,aaa,97, 5BB,bbbb,15, 6CC,cccc,66, 7DD,ddd,73, 8EE,eeeee,42, 9FF,fffff,52, 10GG,ggg,64, 11HH,h,86, 12II,iii,88, 13JJ,jjjj,72,

発生している問題・エラーメッセージ

1,2行目と3行目以降でcsvの規則が異なっているため、3行目でエラーが発生してしまいます。

StringRecord(["[年度]", "2022年度", "[学期]", "1", ""]) StringRecord(["[テスト名]", "中間テスト", "[学年]", "3年", ""]) Error: Error(UnequalLengths { pos: Some(Position { byte: 79, line: 2, record: 2 }), expected_len: 5, len: 4 }) error: process didn't exit successfully: `target\debug\read_csv.exe` (exit code: 1)

該当のソースコード

Rust

1use csv::Error; 2use csv::ReaderBuilder; 3use encoding_rs; 4use std::fs; 5 6fn main() -> Result<(), Error> { 7 let path = "./test.csv"; 8 let file = fs::read(path).unwrap(); 9 let (res, _, _) = encoding_rs::SHIFT_JIS.decode(&file); 10 11 let mut reader = ReaderBuilder::new() 12 .has_headers(false) 13 .from_reader(res.as_bytes()); 14 15 for result in reader.records() { 16 let record = result?; 17 println!("{:?}", record) 18 } 19 20 Ok(()) 21}

補足情報(FW/ツールのバージョンなど)

cargo = "1.62.0"
rustc = "1.62.0"
csv = "1.1.6"
encoding_rs = "0.8.31"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

先頭 2 行を読み飛ばせば良いのでは。

diff

1 use csv::Error; 2 use csv::ReaderBuilder; 3 use encoding_rs; 4-use std::fs; 5+use std::fs::File; 6+use std::io::{Read, BufRead, BufReader}; 7 8 fn main() -> Result<(), Error> { 9 let path = "./test.csv"; 10- let file = fs::read(path).unwrap(); 11+ let f = File::open(path)?; 12+ let mut reader = BufReader::new(f); 13+ 14+ let mut buf = String::new(); 15+ let _ = reader.read_line(&mut buf); 16+ let _ = reader.read_line(&mut buf); 17+ 18+ let mut file = Vec::new(); 19+ reader.read_to_end(&mut file)?; 20 let (res, _, _) = encoding_rs::SHIFT_JIS.decode(&file); 21 22 // 以下略

投稿2022/07/24 23:24

hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Noty0615

2022/07/25 01:28

ご回答ありがとうございます!csvクレートでの読み込みを行う前に、ファイルの読み込み開始位置を進めればよかったんですね。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問