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