zukucode
主にWEB関連の情報を技術メモとして発信しています。

ASP.NET Core アップロードされたCSVファイルを文字列のリストとして読み込む

ASP.NET CoreWebAPIの環境で、アップロードされたCSVファイルを1行ずつ読み込み、文字列string型のリストに格納します。

アップロードされたファイルをバイナリデータ(byte配列)として読み込む方法はASP.NET Core WebAPIでファイルアップロードを行うで紹介していますが、ここでは文字列として1行ずつ読み込む方法を紹介します。

ASP.NET Core WebAPIでファイルアップロードを行うで作成した拡張機能のGetBytesAsyncと同じように。IFormFileの拡張メソッドを作成します。

StreamReaderの第2引数の文字コードはアップロードされるCSVファイルの文字コードに合わせて適宜変更してください。

public static class Extensions
{
    public static async Task<List<string>> ReadCsvAsync(this IFormFile file)
    {
        var result = new List<string>();
        using (var reader = new StreamReader(file.OpenReadStream(), Encoding.UTF8))
        {
            while (reader.Peek() >= 0)
            {
                result.Add(await reader.ReadLineAsync() ?? "");
            }
        }
        return result;
    }
}

コントローラーからは以下のように使用します。(DocumentCreateRequestについてはASP.NET Core WebAPIでファイルアップロードを行うで作成したものと同じです)

DocumentController
    [HttpPost]
    public async Task<IActionResult> Create([FromForm] DocumentCreateRequest request)
    {
        // ファイルをCSV文字列として読み込む
        List<string> csv = await request.File.ReadCsvAsync();

        // CSVデータを使った処理
    }

関連記事