CSVHelper で Shift-JIS のCSV書き込みをした際、改行が入らなかったときの対応


状況

C#でCSVHelperを使ってCSVファイルの読み書きをしている既存プログラムの改修(元は別の人がコーディング)をしています。
元々合ったコードとしては、以下のような感じで、inputCSVを読み込んだ後、1レコードずつ読み込んでいくつか処理をした(中略部分)あと、別のCSVファイル(outputCsv)に書き込むというものでした。

using (var inputCsv = new CsvReader(new StreamReader(inputCsvFilePath, Encoding.GetEncoding(932)), CultureInfo.InvariantCulture))
{
    inputCsv.Configuration.AllowComments = true;
    inputCsv.Configuration.Comment = '#';
    inputCsv.Configuration.HasHeaderRecord = true;

    using (var outputCsv = new CsvWriter(new StreamWriter(outputCsvFilePath, false, Encoding.GetEncoding(932)), CultureInfo.InvariantCulture))
    {
        outputCsv.WriteHeader<inputCsv>();
        var records = inputCsv.GetRecords<inputCsv>();
        foreach( var record in records ){
            //(中略)
            outputCsv.WriteRecord(record);
        }
    }
}

発生した不具合

元々のプログラムでは正常に動いていたのですが、改修の作業を始めてから動作確認をしていたところ、outputCsvの中に書き出されたデータが、改行がされておらず、全てのデータが連続して1行に書き込まれてしまうという事象が発生しました。

解決策

WriteRecordメソッドの下でNextRecordメソッドを実行して、明示的に次のレコードに移行させることで、無事、改行してくれるようになりました。

(追記2020-03-13 13:20)

WriteHeaderの下にもNextRecordは必要でした。

using (var inputCsv = new CsvReader(new StreamReader(inputCsvFilePath, Encoding.GetEncoding(932)), CultureInfo.InvariantCulture))
{
    inputCsv.Configuration.AllowComments = true;
    inputCsv.Configuration.Comment = '#';
    inputCsv.Configuration.HasHeaderRecord = true;

    using (var outputCsv = new CsvWriter(new StreamWriter(outputCsvFilePath, false, Encoding.GetEncoding(932)), CultureInfo.InvariantCulture))
    {
        outputCsv.WriteHeader<inputCsv>();
        outputCsv.NextRecord();
        var records = inputCsv.GetRecords<inputCsv>();
        foreach( var record in records ){
            //(中略)
            outputCsv.WriteRecord(record);
            outputCsv.NextRecord();
        }
    }
}

原因

正直、私がC#は不慣れ(ほとんど初めて触ってる…)なこともあって、詳しい原因はわかっていません…。
ただ、

  • 元のプログラムが数年前に作成された少し古いモノであること。
  • 元々ビルドされたプログラムは問題なく動いていた。
  • 開発環境は引き継いだものではなく、新しく構築しなおしたもの。(Nugetパッケージも新しいものをインストールしていた)

という状況から、推測としては

  • CSVHelperのバージョンが上がった(新しい環境で動いていたのは、最新版の1.5.1。旧環境でのバージョンは、古い環境がすでになく不明)ことによる仕様変更で、NextRecordのコールが必須になった。
  • CSVHelperのバージョンが上がったことでShift-JISでは改行ができなくなるバグが発生している。(UTF-8ではNextRecordをコールしなくても問題にならないかは未確認)

のどちらかかな、と思っていますが、どなたか詳しい方がいましたら、ご教示いただければと思います。

以上、大した情報ではないかと思いますが、ここだけに注目したトピックというのは見当たらず、最初に公式ドキュメントにあたっていなかったらドツボにはまっていたかもな~。と思いましたので、どなたかの参考になればと考えてまとめさせていただきました。