CsvHelper未将数据写入内存流

5

我在使用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个回答

4

由于 CSVHelper 旨在每行 / 每个记录收集 多个 字段,因此它会自己进行一些缓冲,直到您告诉它当前记录已完成:

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

现在,memstream 应该已经包含了数据。但是,除非有其他地方进行更多的处理,否则你的 OutputFile 中的结果是错误的:Data 将会是 byte[] 而不是 "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);

“新项目”,Falcon,7


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接