CsvHelperのConfigurationの設定や例外処理って、難しいですよね・・・。
今日は「CsvHelper.BadDataException」について紹介します。
現場レベルのCsvHelperの実装サンプルを作りました。
CSVデータの取得から、入力チェック、モデル変換まで網羅しています。
5つのシステムで実証したコピペで使い回せる実装法
» 【CsvHelper マスター講座】を見る
CsvHelper BadDataExceptionとは?
どんな例外?
①不正なデータが含まれている
フィールドに引用符が含まれているなど、不正なデータが含まれている場合にCsvHelper.BadDataExceptionがスローされます。
不正なデータの詳細は「CsvHelper BadDataFoundとは?」で解説しています。
②異なる列数が見つかる
異なる列数が見つかるとCsvHelper.BadDataExceptionがスローされます。
ConfigurationにDetectColumnCountChanges = trueが設定されていた場合(デフォルトはfalse)にのみ異なる列数による例外が発生します。
ポイントDetectColumnCountChanges = trueを設定しない場合、
-
列数が少ないなら、
CsvHelper.MissingFieldExceptionがスローされます。 -
列数が多いなら、
例外はスローされずにそのまま処理されます。
CsvHelper.MissingFieldExceptionについて知りたい方は「CsvHelper MissingFieldExceptionとは?」の記事で書いているので、そちらを見てください。
ここでは異なる列数での例外発生について、紹介していきます。
ソースコード例
検証したCsvHelperは、バージョン 15.0.0です。
テストデータ
3行目のデータの列数が少なくなっています。
1,伊藤,東京都
2,佐藤,千葉県
3,
ソース
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の設定」の記事でも書いていますのでどうぞ。