CSVHelper-Нет Выхода


Я пытаюсь создать csv-файл с помощью пакета CSVHelper nuGet

Это код

public ActionResult Test()
{
    var ms = new MemoryStream();
    var sr = new StreamWriter(ms);
    var csv = new CsvWriter(sr);

    csv.WriteField("sd");
    csv.WriteField("sd");
    csv.WriteField("sd");
    csv.WriteField("sd");

    //ms.Seek(0, 0);
    sr.Flush();
    //ms.Position = 0;
    var len = ms.Length;

    return File(ms, "text/csv", "test.csv");
}

Однако файл всегда пуст

Я прочитал здесь несколько вопросов, которые предполагают, что StreamWriter необходимо смыть. Позиция переместилась на 0. Тем не менее, я попробовал это, и это, кажется, не работает

Я также пытался сделать то же самое с using утверждениями для MemoryStream, StreamWriter и CSVWriter Я перепробовал все это, и он по-прежнему пуст

Whatsmore, длина MemoryStream всегда равно нулю

Что я делаю не так?

3 4

3 ответа:

Понял - мне нужно было передать массив байтов, а не поток, в FileContentResult:

return File(ms.ToArray(), "text/csv", "test.csv");

Убедитесь, что вы записываете конец записи при использовании метода WriteField writer.NextRecord(); для записи данных в csv-файл можно использовать следующий код:

using (var sw = new StreamWriter(@"test.csv"))
        {
            var writer = new CsvWriter(sw);
            writer.WriteField("Fist field");
            writer.NextRecord();
            writer.WriteField("Second field");
            writer.NextRecord();
            //add what you wana here
        }

Когда CsvHelper не имеет вывода, наиболее распространенной причиной этого является то, что писатель нуждается в sw.Flush()

Использование CsvWriter без конфигурации отлично работало

CsvWriter(sw); // with no configuration

С помощью конфигурации IgnoreReferences = true я придумал пустой csv

CsvWriter(sw, new Configuration.CsvConfiguration() {
    Delimiter = ";", 
    IgnoreReferences = true
});

Решение (полный пример)

var ms = new System.IO.MemoryStream();
var sw = new System.IO.StreamWriter(ms);
var csvOut = new CsvWriter(sw, new Configuration.CsvConfiguration() { Delimiter = ";", IgnoreReferences = true });

csvOut.WriteRecords(someCollection);

// IMPORTANT LINE
sw.Flush();

ms.Position = 0;
return File(ms, "text/csv", "resultFile.csv");

Подсказка, найденная на Github: https://github.com/JoshClose/CsvHelper/issues/47