Какой стиль является лучшим и эффективным способом экспорта CSV-файла - PullRequest
0 голосов
/ 09 июля 2019

У меня есть два решения для экспорта файла CSV с помощью .net MVC, в котором используется пакет NuGet с именем CsvHelper.

Эти два решения работают с одинаковым результатом, но мне интересно, какое из них лучше работает с процессором, Память, диск io?

есть помощник с CsvHelper

        public static void GenerateCsv<T>(Stream stream, IEnumerable<T> data)
        {
            using (var sw = new StreamWriter(stream, Encoding.UTF8))
            using (var writer = new CsvWriter(sw))
            {
                writer.WriteRecords(data);
            }
        }

        public static byte[] WriteCsvToMemory<T>(IEnumerable<T> data)
        {
            using (var memoryStream = new MemoryStream())
            using (var streamWriter = new StreamWriter(memoryStream))
            using (var csvWriter = new CsvWriter(streamWriter))
            {
                csvWriter.WriteRecords(data);
                streamWriter.Flush();
                return memoryStream.ToArray();
            }
        }

первое решение с использованием Response way

        public void ExportDemoCsv()
        {
            var data = new List<Test>();

            var fileName = "exportExample.csv";

            Response.AppendHeader("content-disposition", "attachment;filename=" + fileName);
            Response.ContentType = "text/csv";
            Response.ContentEncoding = Encoding.UTF8;

            Core.Helpers.CsvHelper.GenerateCsv(Response.OutputStream, data);
        }

второе решение с использованием FileContentResult и получение байта [] от помощника

        public ActionResult ExportDemoCsv()
        {
            var data = new List<Test>();

            var csvByte = Core.Helpers.CsvHelper.WriteCsvToMemory(data); 
            return File(csvByte, "text/csv", "exportExample.csv");
        }

Это всего лишь вопрос, чтобы найти способ получить, как думать, такого рода вопросы и как доказать два решения

использование асинхронного было бы хорошей идеей, нокак узнать пользу.

Обновление: пишу асинхронный режим


        public static async Task<byte[]> WriteCsvToMemory<T>(IEnumerable<T> data)
        {
            using (var memoryStream = new MemoryStream())
            using (var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8))
            using (var csvWriter = new CsvWriter(streamWriter))
            {
                foreach (var record in data)
                {
                    csvWriter.WriteRecord(record);
                    await csvWriter.NextRecordAsync();
                }
                await streamWriter.FlushAsync();
                return memoryStream.ToArray();
            }
        }

1 Ответ

2 голосов
/ 09 июля 2019

Что касается комментария @Christian Sauer, то здесь есть асинхронная версия.

public static async Task GenerateCsv<T>(Stream stream, IEnumerable<T> data)
{
    using (var sw = new StreamWriter(stream, Encoding.UTF8))
    using (var writer = new CsvWriter(sw))
    {
        foreach (var record in data)
        {
            writer.WriteRecord(record);
            await writer.NextRecordAsync();
        }
    }
}
...