尝试使用 CSVhelper 将目录中的多个 .csv 文件合并为一个 .csv 文件时。目录中有 50 个 .csv 文件,在这 50 个文件中有两组文件结构,一组有 7 列,一组有 6 列。每个文件都有完全相同的前 5 个标题,但是根据文件的不同,最后两列将改变。
Example of CSVfile format 1: ![enter image description here](https://i.stack.imgur.com/vZtsD.png)
Example of CSVfile format 2: ![enter image description here](https://i.stack.imgur.com/rI5BO.png)
目录中的每个文件都将保存这些结构中的任何一个,并在列中具有不同的数据。新文件的输出将包含来自所有列的数据,包括“操作”、“代码”和“错误消息”。如果我仅使用具有示例 1 结构的文件,则该文件会完美地组合在一起。但是,如果我包含具有这两种结构的文件并尝试在新文件中使用示例 2 中的“ErrorIPAddress”,我会收到以下错误:
CsvHelper.dll 中发生“CsvHelper.TypeConversion.CsvTypeConverterException”类型的未处理异常
在这一行:`IEnumerable dataRecord = reader.GetRecords().ToList();
我的问题是:如何使用一个文件中不在另一个文件中的列?我尝试用以下内容映射它:Map(m => m.ErrorIPAddress).Index(5);
我相信这是导致我出现问题的行,就好像我将其注释掉一样,错误不会持续存在,但显然我不会将我需要的数据获取到新的 .csv 中。如果我尝试按名称映射:Map( m => m.ErrorIPAddress ).Name( "ErrorIPAddress" );
我收到错误消息,指出 ErrorIPAddress 不在 .csv 文件中,但事实并非如此,因为并非所有文件都有该列。
Output .csv format:![enter image description here](https://i.stack.imgur.com/C0Jsl.png)
最后一列将由格式 2 中的 ErrorIPAddress 列生成。
我假设您使用的是单个类定义,其所有字段如下所示:
public class StudentWebAccess
{
public int StudentID { get; set; }
public string Gender { get; set; }
public int Grade { get; set; }
public int IPAddress { get; set; } // Also ErrorIPAddress?
public DateTime DateTime { get; set; }
public string Action { get; set; }
public string Code { get; set; } // Also ErrorMessage?
}
因此,为了读取文件格式 2,您正在使用 CsvClassMap,但未正确匹配属性和字段名称。它应该看起来像这样:
public class CsvFile2Map : CsvClassMap<StudentWebAccess>
{
public CsvFile2Map()
{
Map(m => m.IPAddress).Name("ErrorIPAddress");
Map(m => m.Code).Name("ErrorMessage");
}
}
如果您的类文件使用 ErrorIPAddress 而不是 IPAddress,则必须反转映射。
Map(m => m.ErrorIPAddress).Name("IPAddress");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)