如何用CsvWriter阻止头记录被写入两次?

问题描述 投票:0回答:1

我正在将一个非常大的代码库从 CsvHelper V15.0.5 升级到 V30.0.1。

现有的代码库相当复杂,但是有一个基本相当于这个的功能:

async Task<string> WriteRecords(IEnumerable rows, Type t)
{
    using (var s = new MemoryStream())
    {
        using (var w = new CsvWriter(new StreamWriter(s), CultureInfo.CurrentCulture, true))
        {
            w.WriteHeader(t);
            await w.NextRecordAsync();
            await w.WriteRecordsAsync(rows);
        }
        
        return Encoding.UTF8.GetString(s.GetBuffer());
    }
}

可以使用设置为可能有 0、1 或数百万行的枚举的行来调用该函数。如果有的话,该函数应该写入行,如果没有,则只写入标题记录。它做得很好,但是升级后,如果枚举器中有任何行,它会将标题行写入两次。

我尝试删除对

WriteHeader(t)
的调用,但是当 rows 参数是空枚举时,标题不会写出。

有没有办法让

WriteRecordsAsync
永远不写出标题行,或者有没有办法让它在行为空时写出标题行?

我似乎无法将

w.Configuration.HasHeaderRow
设置为
false
,因为它是只读的。我也无法真正在可能传递给此方法的所有类上设置属性,因为我并没有真正控制应用程序的这一部分。

我知道我可以做到

if (rows.Any()) ...
,但出于性能原因,我不想将其枚举两次。

c# csvhelper
1个回答
0
投票

CsvHelper 版本 29.0.0

CsvConfiguration
传递
HasHeaderRecord = false
似乎有效。

var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{ 
    HasHeaderRecord = false, 
    LeaveOpen = true 
};
using (var w = new CsvWriter(new StreamWriter(s), config))

CsvHelper版本30.0.0

从版本 30.0.0 开始,

CsvWriter
似乎会忽略
HasHeaderRecord = false
配置。

var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{ 
    HasHeaderRecord = false
};
using (var w = new CsvWriter(new StreamWriter(s), config, true))
© www.soinside.com 2019 - 2024. All rights reserved.