gpt4 book ai didi

c# - 使用 CsvHelper 编写 header ? C#

转载 作者:行者123 更新时间:2023-12-02 03:45:12 26 4
gpt4 key购买 nike

我正在使用 CsvHelper。写信给.csv文件中,我需要一个基于类的 header 。

我手动编写标题并且它可以工作,但是我需要在读取它时自动完成。

我能找到的所有文档都说使用这个表达式,writer.WriteHeader<CSVDataFormat>();但这是行不通的,因为它需要做更多的工作。

这是 header 应基于的类:

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();
}
}
}
}

更新

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

An unhandled exception of type 'CsvHelper.CsvMissingFieldException' occurred in CsvHelper.dll

Additional information: Fields 'FirstName' do not exist in the CSV file.

最佳答案

您可能对 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 block 中。
  • 工资调整略有精简

结果:

FirstName,LastName,Wage
Ziggy,Walters,145.75
Zoey,Strand,84.15

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

对于您正在做的事情,我会读入类型化对象来代替迭代empList。对于编辑中列出的错误,这意味着它无法在输入文件中找到具有该名称的列(可能是因为您没有使用类型重载)。类属性名称应与列名称完全匹配(您可能还需要配置 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);
}

}

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

FirstName,LastName,Wage
Ziggy,Walters,160.325
Zoey,Strand,92.565

<小时/>

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

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 类中。然后将该 map 提供给 CSVHelper:

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

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

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

关于c# - 使用 CsvHelper 编写 header ? C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38088379/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com