CsvHelper BadDataExceptionとは?

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

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

 

コピペで使えるサンプルコードという近道

現場レベルのCsvHelperの実装サンプルを作りました。
CSVデータの取得から、入力チェック、モデル変換まで網羅しています。

5つのシステムで実証したコピペで使い回せる実装法
» 【CsvHelper マスター講座】を見る

目次

CsvHelper BadDataExceptionとは?

どんな例外?

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

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

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

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

②異なる列数が見つかる

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

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

ポイントDetectColumnCountChanges = trueを設定しない場合、

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

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

あわせて読みたい
CsvHelper MissingFieldExceptionとは? CsvHelperのConfigurationの設定や例外処理って、難しいと思っています。 なかなか資料が無いですし、たまに見かけても英語ばかりですし・・・。 今日は「CsvHelper.Mis...

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

ソースコード例

検証した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の設定」の記事でも書いていますのでどうぞ。

よかったらシェアしてね!
目次
閉じる