CsvHelper BadDataFoundとは?

「CsvHelperって、けっこう使われている割に情報が少ない・・・。」
「CsvHelperって、やりたいこと調べるのに時間がかかる・・・。」

こんなことを悩んでいませんか?
こういった疑問に答えます。

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

CsvHelper BadDataFoundとは?

どんな設定?

フィールドに引用符が含まれているなど、不正なデータが含まれている場合に利用する設定です。

ConfigurationBadDataFoundを使うとCsvHelper.BadDataExceptionをスローする代わりに、実行する独自の関数を設定できます。

ソースコード例①

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

テストデータ

“Jo”hn”が不正なデータが含まれているフィールドです。

Copy
"Jo"hn","Doe",43 "Jane","Doe",21  

ソース

Copy
public class Test { public void Main() { var csvFormats = CsvHelperPerformer.GetRecords<CsvModel>(@"C:csvtest.csv"); } } public class CsvHelperPerformer { /// <summary> /// ファイルを読み込む /// </summary> /// <typeparam name="T">変換するクラス</typeparam> /// <param name="path">ファイル</param> 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.BadDataFound = x => { Console.WriteLine($"Bad data: <{x.RawRecord}>"); // 不正なデータが含まれている場合の処理を書く。メソッド化してもOK }; return csv.GetRecords<T>().ToList(); } } } public class CsvModel { [Index(0)] public string FirstName { get; set; } [Index(1)] public string LastName { get; set; } [Index(2)] public int Age { get; set; } } // 【実行結果】 // Bad data: <"Jo"hn",>  

このように不正なデータが含まれているフィールドを見つけたら、独自の関数を実行させます。
x.RawRecordで出力されるデータは、行全体のデータではなく、フィールドのデータです。

ソースコード例②

ConfigurationBadDataFoundを設定しない場合の例です。

テストデータ

先ほどのと同じデータです。

ソース

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> 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; return csv.GetRecords<T>().ToList(); } } } public class CsvModel { [Index(0)] public string FirstName { get; set; } [Index(1)] public string LastName { get; set; } [Index(2)] public int Age { get; set; } } // 【実行結果】 // 例外がスローされました: 'CsvHelper.BadDataException' (CsvHelper.dll の中) // エラー:1行目のデータのフィールドに引用符が含まれています。 // 値:"Jo"hn",  

CsvHelper.BadDataExceptionの例外がスローされます。

CsvHelper.BadDataExceptionは、ConfigurationDetectColumnCountChanges = trueが設定されていた場合(デフォルトはfalse)には、列数の変化を検知して例外をスローするので例外処理の切り分けが必要になります。

ポイント

BadDataFound設定しない場合

  • CsvHelper.BadDataExceptionがスローされます。

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

関連記事

CsvHelperのConfigurationの設定や例外処理って、難しいですよね・・・。 今日は「CsvHelper.BadDataException」について紹介します。 CsvHelper BadDataException[…]

CsvHelper BadDataExceptionとは?

まとめ

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」…給付金の対象講座もある実力派スクール!

参考サイト

Handling bad CSV records in CsvHelper