---
# System prepended metadata

title: UWP／WinUI 3 で CsvHelper を使用したCSVファイルの読み取り　2021-04-15
tags: [WinUI 3, UWP, CsvHelper]

---

---
lang: ja-jp
breaks: true
---
# UWP／WinUI 3 で CsvHelper を使用したCSVファイルの読み取り　2021-04-15

```csharp=
private IEnumerable<List<string>> GetCsvRecord(
    StorageFile csvFile
    )
{
    // .NET Core では、「Encoding.RegisterProvider」を呼び出す必要がある。
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    
    var enc = Encoding.GetEncoding("Shift_JIS");
    using (var reader = new StreamReader(csvFile.Path, enc))
    {
        var configuration = new CsvConfiguration(
            CultureInfo.CurrentCulture
            );
        configuration.Encoding = enc;
        configuration.HasHeaderRecord = true;
        using (var csv = new CsvReader(reader, configuration))
        {
            while (csv.Read())
            {
                List<string> lst = new List<string>();
                lst = csv.Parser.Record.ToList();
                //for (int i = 0; i < csv.ColumnCount; i++)
                //{
                //    lst.Add(csv.GetField(i));
                //}
                yield return lst;
            }
        }
    }
}
```

## 非同期バージョン

```csharp=
private async IAsyncEnumerable<T> GetCsvRecordAsync<T, TMap>(
    StorageFile csvFile,
    Encoding? enc = null,
    bool? detectEncodingFromByteOrderMarks = null
    )
    where TMap : ClassMap
{
    // .NET Core では、「Encoding.RegisterProvider」を呼び出す必要がある。
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    if (enc == null)
    {
        enc = Encoding.UTF8;
    }

    if (detectEncodingFromByteOrderMarks == null)
    {
        detectEncodingFromByteOrderMarks = true;
    }

    using (
        var reader = new StreamReader(
            csvFile.Path,
            enc,
            detectEncodingFromByteOrderMarks.Value
            )
        )
    {
        var configuration = new CsvConfiguration(
            CultureInfo.CurrentCulture
            );
        configuration.Encoding = enc;
        configuration.HasHeaderRecord = true;

        configuration.IncludePrivateMembers = true;

        using (CsvReader csv = new CsvReader(reader, configuration))
        {
            if (typeof(TMap) != typeof(ClassMap))
            {
                csv.Context.RegisterClassMap<TMap>();
            }

            await foreach (T record in csv.GetRecordsAsync<T>()
                        .ConfigureAwait(false)
                )
            {
                yield return record;
            }
        }
    }
}
```

###### tags: `UWP` `CsvHelper` `WinUI 3`
