13,002
回編集
534行目: | 534行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== CSVファイルの書き込み | ==== CSVファイルの書き込み ==== | ||
===== 同期処理 ===== | |||
以下の例では、CsvHelperライブラリを使用して、CSVファイルへ同期的に作成している。<br> | |||
<br> | <br> | ||
System.Text.Encoding.CodePagesを使用しているため、NET Core 3.0以降または.NET 5.0以降が必要となる。<br> | System.Text.Encoding.CodePagesを使用しているため、NET Core 3.0以降または.NET 5.0以降が必要となる。<br> | ||
595行目: | 596行目: | ||
// DateTimeConverterを拡張して、日付を"yyyy年MM月dd日"形式で出力するカスタムコンバータを定義 | // DateTimeConverterを拡張して、日付を"yyyy年MM月dd日"形式で出力するカスタムコンバータを定義 | ||
public class CustomDateTimeConverter : CsvHelper.TypeConversion.DateTimeConverter | |||
{ | |||
public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) | |||
{ | |||
if (value is DateTime dateTime) | |||
{ | |||
return dateTime.ToString("yyyy年MM月dd日"); | |||
} | |||
return base.ConvertToString(value, row, memberMapData); | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
// 生成されるCSVファイル | |||
社員番号,氏名,生年月日 | |||
1,山田 太郎,1980年01月01日 | |||
2,佐藤 花子,1985年05月15日 | |||
3,鈴木 一郎,1990年12月31日 | |||
<br> | |||
===== 非同期処理 ===== | |||
以下の例では、CsvHelperライブラリを使用して、CSVファイルを非同期的に作成している。<br> | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
using System; | |||
using System.IO; | |||
using System.Text; | |||
using System.Globalization; | |||
using System.Collections.Generic; | |||
using System.Threading.Tasks; | |||
using CsvHelper; | |||
using CsvHelper.Configuration; | |||
using CsvHelper.Configuration.Attributes; | |||
public class Person | |||
{ | |||
[Name("社員番号")] | |||
public int Id { get; set; } | |||
[Name("氏名")] | |||
public string Name { get; set; } | |||
[Name("生年月日")] | |||
[Format("yyyy年MM月dd日")] | |||
public DateTime BirthDate { get; set; } | |||
} | |||
class Program | |||
{ | |||
static async Task Main(string[] args) | |||
{ | |||
string filePath = "sample.csv"; | |||
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); | |||
Encoding shiftJis = Encoding.GetEncoding("shift_jis"); // 文字コードをShift-JISに指定する場合 | |||
var records = new List<Person> | |||
{ | |||
new Person { Id = 1, Name = "山田 太郎", BirthDate = new DateTime(1980, 1, 1) }, | |||
new Person { Id = 2, Name = "佐藤 花子", BirthDate = new DateTime(1985, 5, 15) }, | |||
new Person { Id = 3, Name = "鈴木 一郎", BirthDate = new DateTime(1990, 12, 31) } | |||
}; | |||
var config = new CsvConfiguration(CultureInfo.InvariantCulture) | |||
{ | |||
Encoding = shiftJis, // Shift-JISエンコーディングを設定 | |||
HasHeaderRecord = true // CSVファイルにヘッダを書き込む | |||
}; | |||
await using (var writer = new StreamWriter(filePath, false, shiftJis)) | |||
await using (var csv = new CsvWriter(writer, config)) | |||
{ | |||
// DateTimeコンバータを追加して、日付を日本語形式で出力 | |||
csv.Context.TypeConverterCache.AddConverter<DateTime>(new CustomDateTimeConverter()); | |||
await csv.WriteRecordsAsync(records); | |||
} | |||
} | |||
} | |||
// 日付を"yyyy年MM月dd日"形式で出力するカスタムコンバータを定義 | |||
public class CustomDateTimeConverter : CsvHelper.TypeConversion.DateTimeConverter | public class CustomDateTimeConverter : CsvHelper.TypeConversion.DateTimeConverter | ||
{ | { |