CsvHelper BadDataExceptionとは?

CsvHelperのConfigurationの設定や例外処理って、難しいですよね・・・。

今日は「CsvHelper.BadDataException」について紹介します。

CsvHelper BadDataExceptionとは?

どんな例外?

①不正なデータが含まれている

フィールドに引用符が含まれているなど、不正なデータが含まれている場合にCsvHelper.BadDataExceptionがスローされます。

不正なデータの詳細は「CsvHelper BadDataFoundとは?」で解説しています。

関連記事

「CsvHelperって、けっこう使われている割に情報が少ない・・・。」 「CsvHelperって、やりたいこと調べるのに時間がかかる・・・。」 こんなことを悩んでいませんか? こういっ[…]

CsvHelper BadDataFoundとは?

②異なる列数が見つかる

異なる列数が見つかるとCsvHelper.BadDataExceptionがスローされます。

ConfigurationDetectColumnCountChanges = trueが設定されていた場合(デフォルトはfalse)にのみ異なる列数による例外が発生します。

ポイント

DetectColumnCountChanges = trueを設定しない場合

  • 列数が少ないなら、
    CsvHelper.MissingFieldExceptionがスローされます。
  • 列数が多いなら、
    例外はスローされずにそのまま処理されます。

CsvHelper.MissingFieldExceptionについて知りたい方は「CsvHelper MissingFieldExceptionとは?」の記事で書いているので、そちらを見てください。

関連記事

CsvHelperのConfigurationの設定や例外処理って、難しいと思っています。 なかなか資料が無いですし、たまに見かけても英語ばかりですし・・・。 今日は「CsvHelper.MissingFie[…]

CsvHelper MissingFieldExceptionとは?

ここでは異なる列数での例外発生について、紹介していきます。

ソースコード例

検証したCsvHelperは、バージョン 15.0.0です。

テストデータ

3行目のデータの列数が少なくなっています。

Copy
1,伊藤,東京都 2,佐藤,千葉県 3,  

ソース

Copy
public class Test { public void Main() { try { var csvFormats = CsvHelperPerformer.GetRecords<CsvModel>(@"C:csvtest.csv"); } catch (CsvHelper.BadDataException ex) { Console.WriteLine($"エラー:{ex.ReadingContext.Row}行目のデータの列数は前の行と異なります。列数が多いか、または不足しています。"); Console.WriteLine($"値:{ex.ReadingContext.RawRecord}"); } } } public class CsvHelperPerformer { /// <summary> /// ファイルを読み込む /// </summary> /// <typeparam name="T">変換するクラス</typeparam> /// <param name="path">ファイル</param> /// <returns></returns> public static List<T> GetRecords<T>(string path) { using (var reader = new StreamReader(path, Encoding.GetEncoding("SHIFT_JIS"))) using (var csv = new CsvReader(reader, new CultureInfo("ja-JP", false))) { csv.Configuration.HasHeaderRecord = false; csv.Configuration.DetectColumnCountChanges = true; // trueに設定しないと例外が発生しません。 return csv.GetRecords<T>().ToList(); } } } public class CsvModel { [Index(0)] public int Id { get; set; } [Index(1)] public string Name { get; set; } [Index(2)] public string Address { get; set; } } // 【実行結果】 // エラー:3行目のデータの列数は前の行と異なります。列数が多いか、または不足しています。 // 値:3,  

このようにデータの列数の変化を見つけたら、例外で処理したい場合に使うこができます。

例ではあげていませんが、もちろん列数が増えている場合にも例外が発生します。

まとめ

CsvHelperのConfigurationの設定や例外処理って、難しいですよね。

他のConfigurationの設定や例外について知りたい方は「CsvHelper Configurationの設定」の記事でも書いていますのでどうぞ。

関連記事

CsvHelperって、C#でCSVの読み書きをするには非常に便利なんですが、イマイチ情報が足りない気がしています。 ConfigurationのPropertiesの設定情報はいつも調べるんですが、毎回googl[…]

CsvHelper Configurationの設定
関連記事

こんにちは!トミセンです。 C#でCSVファイルの操作に便利なCsvHelperですが、 「CsvHelper って、全然情報無いから使えないよね。」 「CsvHelper って、どう使うの[…]

C# CsvHelper の使い方【現役プログラマーが伝授!】

\ 転職を本気で考えるなら /

  • 3つの有名スクールを現役エンジニアの視点で厳選!
  • あなたに合ったおすすめのスクールを紹介!

TECH CAMP エンジニア転職」…最短10週間で転職ができる年齢無制限のスクール!

TechAcademy Pro」…オンラインで全て完結のコスパ最強スクール!

DMM WEBCAMP」…給付金の対象講座もある実力派スクール!