首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CsvHelper写行号

CsvHelper写行号
EN

Stack Overflow用户
提问于 2022-10-05 10:25:20
回答 1查看 133关注 0票数 1

我使用CsvHelper将数据导出到文件中,并且需要包括行号。

因为我的数据来自Server,所以我只是在类中添加了一个LineNumber,并通过TSQL使用ROW_NUMBER()填充它,并且工作得很好。我在想,也许CsvHelper已经有办法做到这一点了。

我试过以下几种方法,但不起作用:

代码语言:javascript
复制
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中,我能够像这样设置行号(这适用于阅读):

代码语言:javascript
复制
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是否有某种机制可以编写行号而不必在类映射之外填充它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-05 11:32:19

根据这句话,您使用的Convert过载仅用于阅读(Convert以前称为ConvertUsing)。有一个重载的写入,但它没有访问IReaderRow,而是使用您的类的当前实例的该行。

相反,您可以定义自定义ITypeConverter

代码语言:javascript
复制
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()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73959047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档