CsvHelper 只是为类列表编写标题

如何解决CsvHelper 只是为类列表编写标题

此处和 CsvHelper 的文档中有许多使用 CsvHelper 编写 CSV 的示例。没有人帮我写一个类列表

列表是这些对象的

#include <Registry.hpp>

TRegistry *Reg = new TRegistry;
String buf;

Reg->RootKey = ...;
if (Reg->OpenKeyReadOnly(_D("...")))
{
    buf = Reg->ReadString(_D("Nazwa"));
    Reg->CloseKey();
}
delete Reg;

这个

class Contract
{
    public Contract()
    {
        Id = "None";
        Type = "";
        FileNames = new List<string>();
    }
    public string Id { get; set; }
    public string Type { get; set; }
    public List<String> FileNames { get; set; }
    public override string ToString()
    {
        string result = "Contract:ID " + Id
        + ",Type " + Type
        + ",FileNames ";
        foreach (string FileName in FileNames)
        {
            result = result + FileName + ",";
        }
        return result;
    }
}

只带回没有合同列表的标题。如何正确地将合约列表写成 csv ?

解决方法

所提出的问题是,正如 user nilsK in a comment 所指出的,在写入标头后代码丢失了 csv.NextRecord();

此外,您似乎也想将文件名写入 CSV 文件。由于 CsvHelper 不会直接为您编写 List<string>,您可以向它可以编写的 Contract 类添加另一个属性。

最好用一个不会出现在文件名中的字符来分隔文件名,例如分号。

using CsvHelper;
using CsvHelper.Configuration;
using CsvHelper.TypeConversion;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;

namespace CsvWrite
{

    public class Program
    {
        public class ContractMap : ClassMap<Contract>
        {
            public ContractMap()
            {
                Map(m => m.Id).Index(0).Name("Id");
                Map(m => m.Type).Index(1).Name("Type");
                Map(m => m.FileNames).Index(2).Name("Filenames");
            }
        }

        public class Contract
        {
            public string Id { get; set; }
            public string Type { get; set; }
            public List<String> FileNames { get; set; }
            public string Filenames { get => string.Join(";",FileNames); }

            public Contract()
            {
                Id = "None";
                Type = "";
                FileNames = new List<string>();
            }

            public override string ToString()
            {
                return "Contract:ID " + Id
                + ",Type " + Type
                + ",FileNames " + string.Join(',',FileNames);
            }
        }

        public static void SaveCsv(string PathCsv,List<Contract> contracts)
        {
            Console.WriteLine("Save Contracts to " + PathCsv);

            var config = new CsvConfiguration(CultureInfo.InvariantCulture)
            {
                Delimiter = ";",Encoding = Encoding.UTF8
            };
            using (var writer = new StreamWriter(PathCsv))
            using (var csv = new CsvWriter(writer,config))
            {
                csv.WriteRecords(contracts);
            }
        }

        static void Main(string[] args)
        {
            var contracts = new List<Contract>();

            contracts.Add(new Contract { Type = "A",Id = "1"});
            contracts.Add(new Contract { Type = "BB",Id = "100",FileNames = new List<string> { "F1","F2" } });
            contracts.Add(new Contract { Type = "CCC",Id = "1111","F2","F3","F4","F5","F6","F7","F8","F9","F10" } });

            string f = @"C:\temp\SaveCsv.csv";
            SaveCsv(f,contracts);
        }
    }
}

输出:

Id;Type;Filenames
1;A;
100;BB;"F1;F2"
1111;CCC;"F1;F2;F3;F4;F5;F6;F7;F8;F9;F10"
,

如果你知道文件名的数量,你可以让它像这样写出标题,使用带有开始和结束索引的 ClassMap.Index()

Id;Type;FileName1;FileName2;FileName3

void Main()
{
    var records = new List<Contract>
    {
        new Contract { Id = "First",Type = "MyType",FileNames = new List<string> {"one","two","three"} },new Contract { Id = "Second",Type = "MyOtherType",FileNames = new List<string> {"four","five","six"} }
    };

    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        Delimiter = ";",Encoding = Encoding.UTF8
    };

    //using (var writer = new StreamWriter("path\\to\\file.csv"))
    using (var csv = new CsvWriter(Console.Out,config))
    {
        csv.Context.RegisterClassMap<ContractMap>();
        
        csv.WriteRecords(records);
    }
}

class ContractMap : ClassMap<Contract>
{
    public ContractMap()
    {
        Map(x => x.Id);
        Map(x => x.Type);
        Map(x => x.FileNames).Name("FileName").Index(3,5);
    }
}

class Contract
{
    public Contract()
    {
        Id = "None";
        Type = "";
        FileNames = new List<string>();
    }
    public string Id { get; set; }
    public string Type { get; set; }
    public List<String> FileNames { get; set; }
    public override string ToString()
    {
        string result = "Contract:ID " + Id
        + ",Type " + Type
        + ",FileNames ";
        foreach (string FileName in FileNames)
        {
            result = result + FileName + ",";
        }
        return result;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?