0

我有一个类,我正在写入这样的 CSV 文件:

csvWriter.Configuration.RegisterClassMap(new AffidavitFullAndPartialMapping(detailLevel));
csvWriter.WriteRecords(allAffidavits);

在我发送要写入的“allAffidavits”集合之后,我想手动将另一行写入 CSV。最后一行将是所有空格,除了最后一个单元格需要包含特定值。

所以我想我会做一些在官方 CsvHelper 文档中描述的事情(在一个名为“编写单个字段”的部分中):

如果您愿意,您也可以手动编写每个字段。

var csv = new CsvWriter( textWriter );
foreach( var item in list )
{
  csv.WriteField( "a" );
  csv.WriteField( 2 );
  csv.WriteField( true );
  csv.NextRecord();
}

但是我怎么知道要手动写入多少个空白单元格呢?这与我的 CSV 文件中已有的列数相同。由于映射(参见本文顶部的第一行代码),它可能会动态变化。

谢谢,
埃利泽

4

2 回答 2

1

您可以遍历所有属性和参考地图并计算它们。可以设置更高的索引,因此最好找到最高索引。有一个内部方法可能应该公开,您可以使用它。

internal int GetMaxIndex()
{
    if( PropertyMaps.Count == 0 && ReferenceMaps.Count == 0 )
    {
        return -1;
    }

    var indexes = new List<int>();
    if( PropertyMaps.Count > 0 )
    {
        indexes.Add( PropertyMaps.Max( pm => pm.Data.Index ) );
    }
    indexes.AddRange( ReferenceMaps.Select( referenceMap => referenceMap.GetMaxIndex() ) );

    return indexes.Max();
}

现在只复制这个。如果它适合您,请在 GitHub 中提交票证以公开此方法。

于 2015-06-30T19:27:26.237 回答
0

乔希,非常感谢您的解决方案。自从发布我最初的问题以来,我想到了类似的东西。

我替换了上面的两行:

csvWriter.Configuration.RegisterClassMap(new AffidavitFullAndPartialMapping(detailLevel));
csvWriter.WriteRecords(allAffidavits);

有了这个:

var classMapping = new AffidavitFullAndPartialMapping(detailLevel);
csvWriter.Configuration.RegisterClassMap(classMapping);
csvWriter.WriteRecords(allAffidavits);

然后我能够获得 CSV 中的列数:

int numberOfColumnsInCsv = classMapping.PropertyMaps.Count;

并在一个循环中 - 迭代多次 - 执行以下操作:

csvWriter.WriteField(string.Empty);
于 2015-06-30T19:58:04.743 回答