繁体   English   中英

使用CsvHelper从单个csv文件中读取多个类

[英]Reading multiple classes from single csv file using CsvHelper

最近我一直在使用Josh Close'CsvHelper来解析CSV文件,我非常喜欢用于类映射的流畅api。

我正在尝试映射包含多种记录类型的csv文件,文件结构是

C,Comment,Timestamp
I,Class1,Header1,Header2
D,Class1,Data1,Data2
D,Class1,Data1,Data2
...
I,Class2,Header1,Header2,Header3
D,Class2,Data1,Data2,Data3
D,Class2,Data1,Data2,Data3
...
C,Checksum

这是CsvHelper可以处理的东西吗? 我已经编写了一个自定义解析器,它基本上可以工作,但它真正做的就是过滤掉特定类的Header和Data字段 - 我真的希望能够做类似的事情

csv.Configuration.RegisterClassMap<Class1>();
csv.Configuration.RegisterClassMap<Class2>();

var data1 = csv.GetRecords<Class1>().ToList();             
var data2 = csv.GetRecords<Class2>().ToList();

并一次读取文件? 这是可能的还是我使用了错误的解析器?

关心戴夫

有办法做到这一点; 你只需要手动完成。

  1. 您逐行手动读取csv文件
  2. 检查第一列是否有标识符,表明您需要映射到Class对象。
  3. 检查要映射到的类的第二列。
  4. 将整行映射到给定的类。

     public static void ReadMultiClassCsv() { var class1Data = new List<Class1>(); var class2Data = new List<Class2>(); using (StreamReader reader = File.OpenText(@"C:\\filename.csv")) using (var csvReader = new CsvReader(reader)) { //1. You manually read the csv file row by row while (csvReader.Read()) { var discriminator = csvReader.GetField<string>(0); //2. Inspect the first column for the discriminator that will indicate that you need to map to a Class object. if (discriminator == "D") { var classType = csvReader.GetField<string>(1); //3. Inspect the second column for the class to map to. switch (classType) { //4. Map the entire row to that given class. case "Class1": class1Data.Add(csvReader.GetRecord<Class1>()); break; case "Class2": class2Data.Add(csvReader.GetRecord<Class2>()); break; default: break; } } } } } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM