使用CsvHelper编写标题? C# - c#

我正在使用CsvHelper。要写入.csv文件,我需要基于类的标头。

我手动编写了标头,但它可以工作,但是读取标头时需要自动完成。

我可以找到的所有文档都说要使用此表达式writer.WriteHeader<CSVDataFormat>();,但这不起作用,因为它需要完成更多工作。

这是标头应基于的类:

public class CSVDataFormat
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public float Wage { get; set; }
}

这是读写代码:

private void ReadCSV(string ogCsvFile)
{
        using (var streamReaederfileDir = new StreamReader(@ogCsvFile))
        {
            using (var streamWriterFileDir = new StreamWriter(Path.Combine(Path.GetDirectoryName(ogCsvFile), "New" + Path.GetFileName(ogCsvFile))))
            {
                var reader = new CsvReader(streamReaederfileDir);
                var writer = new CsvWriter(streamWriterFileDir);

                writer.WriteHeader<CSVDataFormat>();

                IEnumerable records = reader.GetRecords<CSVDataFormat>().ToList();

                foreach (CSVDataFormat record in records)
                {
                    record.Wage = record.Wage + (record.Wage / 10);
                    writer.WriteField(record.FirstName);
                    writer.WriteField(record.LastName);
                    writer.WriteField(record.Wage);
                    writer.NextRecord();
                }
            }
        }
}

更新资料

这是我运行代码时遇到的错误:

CsvHelper.dll中发生类型为'CsvHelper.CsvMissingFieldException'的未处理异常

附加信息:CSV文件中不存在字段“名字”。

参考方案

您可能对CSVHelper的工作方式感到困惑。这段代码处理读入-写出循环的写方面:

List<Employee> empList = new List<Employee>();

empList.Add(new Employee { FirstName = "Ziggy", LastName = "Walters", Wage = 132.50F });
empList.Add(new Employee { FirstName = "Zoey", LastName = "Strand", Wage = 76.50F });

using (StreamWriter sw = new StreamWriter(@"C:\Temp\emp.csv"))
using (CsvWriter cw = new CsvWriter(sw))
{
    cw.WriteHeader<Employee>();

    foreach (Employee emp in empList)
    {
        emp.Wage *= 1.1F;
        cw.WriteRecord<Employee>(emp);
    }
}

CSVWriter实现了IDisposable,因此我也将其放入了using块。
工资调整略有精简

结果:

名,姓,工资
齐吉·华特斯(Wilders)145.75
佐伊·斯特兰德84.15

写标题只写第一行-列/项目的名称。请注意,列出的工资与我用来创建每个工资的工资不同。

对于您正在执行的操作,我将读取一个类型化的对象来代替empList的迭代。对于编辑中列出的错误,这意味着它无法在输入文件中找到该名称的列(可能是因为您没有使用Types重载)。类属性名称应与列名称完全匹配(您可能还需要配置CSVHelper)。

完整的输入输出循环稍微复杂一点:

using (StreamReader sr = new StreamReader(@"C:\Temp\empIN.csv"))
using (StreamWriter sw = new StreamWriter(@"C:\Temp\empOUT.csv"))
using (CsvWriter cw = new CsvWriter(sw))
using (CsvReader cr = new CsvReader(sr))
{
    cw.WriteHeader<Employee>();
    var records = cr.GetRecords<Employee>();

    foreach (Employee emp in records)
    {
        emp.Wage *= 1.1F;
        cw.WriteRecord<Employee>(emp);
    }

}

使用第一个循环的输出作为输入的结果:

名,姓,工资
齐格·沃尔特斯160.325
Zoey,Strand,92.565

如果传入的CSV中没有标题记录,它将不知道如何将数据映射到该类。您需要添加地图:

public class EmployeeMap :  CsvHelper.Configuration.CsvClassMap<Employee>
{
    public EmployeeMap()
    {
        Map(m => m.FirstName).Index(0);
        Map(m => m.LastName).Index(1);
        Map(m => m.Wage).Index(2);
    }
}

我的嵌套在Employee类中。然后给CSVHelper映射:

... before your try to read from the incoming CSV:
cr.Configuration.RegisterClassMap<Employee.EmployeeMap>();

cw.WriteHeader<Employee>();
...

现在,它知道如何将csv列映射到类中的属性。

C#-如何使用正则表达式替换NULL字符? - c#

我有以下字符串:< \0\"\0E\0x\0t\0e\0n\0s\0i\0b\0i\0l\0i\0t\0y\0,\0v\0e\0r\0s\0i\0o\0n\0=\0\\\0\"\07\0.\00\0.\03\03\00\00\0.\00\0\\\0\"\0,\0p\0u\0b\0l\0i\0c\0K\0e\0y\0T\0o…

cURL发布到HTTPCLient C# - c#

我正在尝试将文件发布到PushBullet API服务。API的信息站点显示了一个示例:curl -i https://api.pushbullet.com/api/pushes \ -u API_KEY: -F device_iden=u1qSJddxeKwOGuGW -F type=file -F [email protected] 我正在尝试使用C#中的Ht…

C#-文本框的XML子节点 - c#

我在将子节点文本放入c#的富文本框中时遇到麻烦。到目前为止,这是我尝试过的:这是XML文件:<DATA_LIST> <Customer> <Full_Name>TEST</Full_Name> <Total_Price>100</Total_Price> <Discounts>…

将数据从ip套接字转发到蓝牙套接字。 C# - c#

我想在特定端口上监听传入的IP套接字,并使用蓝牙套接字转发它们。这可能吗?我正在使用c#,但是如果可以更轻松地编写代码,则可以使用java。 参考方案 实际上,该对象正在通过蓝牙连接使用SMB协议。我找到了一个类似于SMB协议的蓝牙配置文件,它使我能够从PC上浏览sdcard。该配置文件是OBEX FTP(文件传输配置文件),我发现了Java API。谢谢您…

Winapp(C#)调用Java应用程序->设置进度栏 - c#

我有一个C#winapp,它与Java应用程序通信以通过tcp检索数据。现在,我想添加一个进度条,以等待并显示数据下载繁忙。因为这时winapp冻结,直到它拥有来自Java的所有数据为止。现在我想知道如何编程。因为我认为Java应该不时返回某些东西来在c#中设置进度条。我想我需要使用线程来做,但是我不确定如何去做。如果有人有其他想法或例子,那就太好了。 参考…