【问题标题】:CsvHelper not writing data to memory streamCsvHelper 未将数据写入内存流
【发布时间】:2016-09-30 21:58:18
【问题描述】:

在使用 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());
}

【问题讨论】:

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


    【解决方案1】:

    由于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);
    

    “新物品”,猎鹰,7

    【讨论】:

      猜你喜欢
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      相关资源
      最近更新 更多