CSVHelperで文字コード・改行コード・囲い字・エスケープ文字・区切り文字が変更できるか検証してみる

2021-08-26

RFC4180って皆さんご存知ですか?CSV形式をなんとなく取り扱っている人はぜひ読んでみてください。

これは、CSVとはいったいどういった形式であるのかを国際的に定めている文書になります。
今回は、これに定められたルールに関して、

  • そもそも対応可能なのか?
  • もし部分的に独自の設定をしようとしたら変えられるのか?

という二視点でCSVHelperを確認していこうと思います。

この辺の挙動確認してないと設計に組み込むのは不安よね。

検証するCSVHelperについて

  • v27.1.1を使用

ソースコードはベースとしてこちらの記事に書いたコードを改造して使っていきます。

CsvHelperを使ってみた。だけ。
mikan-tech.info

文字コードを変える

RFC4180ではASCIIを推奨していますが、日本語である以上Shift-JisだったりUTF-8だったりします。その辺の入力・出力仕様を変えられるのか確認します。

            //read
            using (var reader = new StreamReader(@"C:\jikken\jikken.csv",
                Encoding.GetEncoding("utf-8")))
            using (var csv = new CsvReader(reader, config))
            {
                csv.Context.RegisterClassMap<CsvMap>();
                records = csv.GetRecords<Csv>().ToList();
            }

CSVHelperは読み書きにStreamReader・StreamWriterを使用します。なのでテキストファイルを読み書きするときと同じように引数でエンコードを渡せばテキストファイルと同じように文字コードを指定して読むことが可能です。

改行コードを変える

CSVHelperの初期値は「CRLF」となっており、CRでもLFでもどちらでも関係なく改行として読み込めました。

出力をLFに変えたい時などは設定をこんな感じで書けば変更できます。

var config = new CsvConfiguration(new CultureInfo("ja-JP", false))
{
    NewLine="\n"
};

ちなみに

改行コードは普通に文字で指定することも可能です。

var config2 = new CsvConfiguration(new CultureInfo("ja-JP", false))
{
    HasHeaderRecord = false,
    NewLine="改行!"
};

出力してみるとこんな感じ。
なんとなく暗号感ありますね。

囲い字は?

囲い字ももちろん変更可能でした。
下記の設定だと囲い字は「k」で常に囲い字を出力、となります。

var config2 = new CsvConfiguration(new CultureInfo("ja-JP", false))
{
    Quote = 'k',
    ShouldQuote = x=> true
};

エスケープ文字は?区切り文字は?

変更できました!区切り文字が「Delimiter」、エスケープ文字の指定が「Escape」になります。

var config2 = new CsvConfiguration(new CultureInfo("ja-JP", false))
{
    Quote = 'k' ,
    ShouldQuote = (x)=> true,
    Escape='\\',
    Delimiter=","
};

まとめ

CSVHelperを使えばだいたい特殊仕様でも対応できそうな感じです。メソッドを見ていると「コメント判定するためのメソッド」とか「(多分)セル内で改行のための文字指定」とか他にも色々細かく設定できそうな感じでした。