CsvHelper没有将数据写入内存流

时间:2016-06-01 13:32:56

标签: c# csv export-to-csv csvhelper

遇到CsvHelper的一些问题并写入内存流。我已经尝试刷新流编写器并设置位置和其他一切尝试。我想我已经把它缩小到一个非常简单的测试用例,显然是失败的。我在这里做错了什么?

public OutputFile GetTestFile()
{
    using (var ms = new MemoryStream())
    using (var sr = new StreamWriter(ms))
    using (var csv = new CsvWriter(sr))
    {
        csv.WriteField("test");
        sr.Flush();

        return new OutputFile
        {
            Data = ms.ToArray(),
            Length = ms.Length,
            DataType = "text/csv",
            FileName = "test.csv"
        };
    }
}

[TestMethod]
public void TestWritingToMemoryStream()
{
    var file = GetTestFile();
    Assert.IsFalse(file.Data.Length == 0);
}

为人们谷歌搜索正确的答案,因为这个更正的代码实际上通过了我的测试。我不知道为什么写入StringWriter然后将其转换为字节解决了所有疯狂的刷新问题,但它现在有效。

using (var sw = new StringWriter())
using (var csvWriter = new CsvWriter(sw, config))
{
    csvWriter.WriteRecords(records);
    return Encoding.UTF8.GetBytes(sw.ToString());
}

1 个答案:

答案 0 :(得分:3)

由于CSVHelper意味着每行/每行收集几个字段,因此在您告诉当前记录完成之前,它会进行一些缓冲:

csv.WriteField("test");
csv.NextRecord();
sr.Flush();

现在,memstream应该包含数据。但是,除非在其他地方有更多处理,否则OutputFile的结果是错误的:Databyte[]不是" text / csv"。似乎StringWriter会产生更合适的东西:

string sBuff;
using (StringWriter sw = new StringWriter())
using (CsvWriter csv = new CsvWriter(sw))
{
    csv.WriteRecord<SomeItem>(r);
    sBuff = sw.ToString();
}
Console.WriteLine(sBuff);
  

&#34; New Item&#34;,Falcon,7