C# CsvHelperでCSVの読み書き

CSVを扱う必要があったので使い方をメモ。

CSV書き込み

各カラムをダブルクォーテーションで囲むようなCSVファイルを出力していきます。
オプション等はコードに記載。
ドキュメントが見当たらなかったのでソースで確認。
https://github.com/JoshClose/CsvHelper/blob/master/src/CsvHelper/Configuration/CsvConfiguration.cs

private static void WriteCsv()
{
    // https://github.com/JoshClose/CsvHelper/blob/master/src/CsvHelper/Configuration/CsvConfiguration.cs
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        // 各カラムをトリミングするか
        TrimOptions = TrimOptions.Trim,
        // コメントを許可するか
        AllowComments = true,
        // コメントの開始文字。デフォルトで#なのであまり設定する必要はなさそう
        Comment = '#',
        // 区切り文字。デフォルトで,なので設定する必要はなさそう
        Delimiter = ",",
        // CSVの列数が想定と異なっていた場合にエラーにするか
        DetectColumnCountChanges = true,
        // カラムの括り文字。デフォルトで"なので設定する必要はなさそう
        Quote = '"',
        // カラムを全部括り文字で括る場合はtrueを設定
        ShouldQuote = (context) => true,
        // エスケープする文字。デフォルトで"なので設定する必要はなさそう
        Escape = '"',
        // ヘッダの有無。デフォルトであり(true)
        HasHeaderRecord = true,
        // 空行を無視するか。デフォルトで無視設定(true)
        IgnoreBlankLines = true
    };

    using var writer = new StreamWriter("./write.csv");
    using var csv = new CsvWriter(writer, config);

    CsvModel record1 = new()
    {
        No = 1,
        Message = "Message1"
    };
    CsvModel record2 = new()
    {
        No = 2,
        Message = "Message2\r\nMessage2-1"
    };

    List<CsvModel> records = new()
    {
        record1, record2
    };

    // 1行ずつ書き込み
    //csv.WriteRecord(record1);
    //csv.WriteRecord(record2);

    // 複数行書き込み
    csv.WriteRecords<CsvModel>(records);
}

CsvModel

class CsvModel
{
    public int No { get; set; }
    public string Message { get; set; } = string.Empty;
}

出力結果がこちら

"No","Message"
"1","Message1"
"2","Message2
Message2-1"

CSV読み込み

CSV書き込みで出力したファイルをそのまま読み込みます。
オプションは全く同じものを使用しました。
不要なものもありますが、必要に応じて変更してください。

private static void ReadCsv()
{
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        // 各カラムをトリミングするか
        TrimOptions = TrimOptions.Trim,
        // コメントを許可するか
        AllowComments = true,
        // コメントの開始文字。デフォルトで#なのであまり設定する必要はなさそう
        Comment = '#',
        // 区切り文字。デフォルトで,なので設定する必要はなさそう
        Delimiter = ",",
        // CSVの列数が想定と異なっていた場合にエラーにするか
        DetectColumnCountChanges = true,
        // カラムの括り文字。デフォルトで"なので設定する必要はなさそう
        Quote = '"',
        // カラムを全部括り文字で括る場合はtrueを設定
        ShouldQuote = (context) => true,
        // エスケープする文字。デフォルトで"なので設定する必要はなさそう
        Escape = '"',
        // ヘッダの有無。デフォルトであり(true)
        HasHeaderRecord = true,
        // 空行を無視するか。デフォルトで無視設定(true)
        IgnoreBlankLines = true
    };

    using var reader = new StreamReader("./write.csv");
    using var csv = new CsvReader(reader, config);

    var records = csv.GetRecords<CsvModel>();
    foreach (var record in records)
    {
        Debug.WriteLine($"{record.No}, {record.Message}");
    }
}

以上です。

コメント

タイトルとURLをコピーしました