c# - 在特定位置写入数据

标签 c# csvhelper

我有以下代码:


class Dto
{
    public string Data1 { get; set; }
    public string DataN { get; set; }
    public string DataN1 { get; set; }
}

class DtoMap : ClassMap<Dto>
{
    public DtoMap()
    {
        Map(x => x.Data1).Index(0);

        // Note that I need to skip N columns
        Map(x => x.DataN).Index(N);
        Map(x => x.DataN1).Index(N1);
    }
}

// create csv

using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream))
using (var csvWriter = new CsvWriter(streamWriter, csvConfiguration))
{
    csvWriter.Configuration.RegisterClassMap<TMap>();
    csvWriter.WriteRecords(records);
    streamWriter.Flush();

    return memoryStream.ToArray();
}

预期结果为以下 CSV 表:

<表类="s-表"> <头> 标题 1 标题... 标题n 标题 n + 1 <正文> 数据1 ... 数据N 数据 N + 1 数据2 ... 数据N 数据 N + 1

似乎在写入 csv 文件时忽略了索引。问题发生在 15.0.6 和 26.0.0 版本。有什么建议吗?

最佳答案

CsvHelper 将按照索引指定的顺序输出列,但不会为缺少的索引添加空列。如果您需要这样做,您可以使用 Map().Index(i).Constant(""); 来指示应在特定索引处使用常量值 i。使用它来为要留空的列填充一个常量空值:

class DtoMap : ClassMap<Dto>
{
    const int N = 12;

    public DtoMap() : this(true) { }
    
    public DtoMap(bool includeEmptyColumns)
    {
        Map(x => x.Data1).Index(0);

        if (includeEmptyColumns)
        {
            for (int i = 1; i < N; i++)
            {
                Map().Index(i).Constant("");
            }
        }

        // Note that I need to skip N columns
        Map(x => x.DataN).Index(N);
        Map(x => x.DataN1).Index(N + 1);
    }
}

参见: Constant Value .

这会使列标题留空。如果您需要提供一些默认列标题,您可以使用 .Name(string) 指定一个:

Map().Index(i).Constant("").Name($"Column {i}");

但是,您将无法使用此类映射来读取您的 CSV,因为(至少从 CsvHelper 26.1.0 开始)读取器会在未映射列时抛出错误给类成员即使它是常量。要解决该错误,请在读取时使用 new DtoMap(false),即:

var newRecords = ReadCSV(csv, new DtoMap(false), config);

static List<TRecords> ReadCSV<TRecords>(byte [] data, ClassMap<TRecords> map, CsvConfiguration csvConfiguration)
{
    using (var memoryStream = new MemoryStream(data))
    using (var streamWriter = new StreamReader(memoryStream))
    using (var csvReader = new CsvReader(streamWriter, csvConfiguration))
    {
        csvReader.Context.RegisterClassMap(map);
        return csvReader.GetRecords<TRecords>().ToList();
    }
}

演示 fiddle herehere .

关于c# - 在特定位置写入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67216668/

相关文章:

c# - 自定义序列化程序如何影响搜索?

c# - 使用 CsvHelper 将引号写入特定的 CSV 字段

c# - csvHelper动态加载子类

c# - C# 中的 JSON 字符串到 CSV 和 CSV 到 JSON 的转换

c# - 使用 CsvHelper 时如何从 C# 动态对象中获取属性名称和值?

csvhelper - CSVHelper v23 中的PrepareHeaderForMatch 更改

C# MVC : Trailing equal sign in URL doesn't hit route

c# - DirectShow 将 sampleGrabber 转换为 ISampleGrabber

c# - C# 在控制台上打印 ASCII 字符

c# - 从代码调用时Mysql存储过程结果不同