我使用CsvHelper将数据导出到文件中,并且需要包括行号。
因为我的数据来自Server,所以我只是在类中添加了一个LineNumber,并通过TSQL使用ROW_NUMBER()填充它,并且工作得很好。我在想,也许CsvHelper已经有办法做到这一点了。
我试过以下几种方法,但不起作用:
public sealed class DetailMap : ClassMap<Detail>
{
public DetailMap()
{
Map().Convert(r => r.Row.Context.Writer.Row).Index(0);
Map(d => d.Field1).Index(1);
Map(d => d.Field2).Index(2);
}
}它只是跳过了第一个索引。
通过共享,在CsvReader中,我能够像这样设置行号(这适用于阅读):
public sealed class DetailMap : ClassMap<Detail>
{
public DetailMap()
{
Map(d => d.LineNumber).Convert(r => r.Row.Context.Parser.Row);
Map(d => d.Field1).Index(0);
Map(d => d.Field2).Index(1);
}
}CsvHelper是否有某种机制可以编写行号而不必在类映射之外填充它?
发布于 2022-10-05 11:32:19
根据这句话,您使用的Convert过载仅用于阅读(Convert以前称为ConvertUsing)。有一个重载的写入,但它没有访问IReaderRow,而是使用您的类的当前实例的该行。
相反,您可以定义自定义ITypeConverter。
public class RowNumberConverter : DefaultTypeConverter
{
public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
{
var rowNumber = row.Context.Writer.Row;
if (row.Configuration.HasHeaderRecord)
rowNumber--;
return rowNumber.ToString();
}
}然后将其应用于您的行号字段:
Map(d => d.LineNo).TypeConverter<RowNumberConverter>().Index(0);
上面的示例假设您希望您的第一行数据是第1行,即使您有标题行。如果不是这样的话,您可以删除额外的代码并返回row.Context.Writer.Row.ToString()
https://stackoverflow.com/questions/73959047
复制相似问题