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}");
}
}
以上です。
コメント