使用 CsvHelper 从单个 csv 文件读取多个 类
Reading multiple classes from single csv file using CsvHelper
我最近一直在使用 Josh Close 的 CsvHelper 来解析 CSV 文件,我非常喜欢 class 映射的流畅 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可以处理的吗?我写了一个自定义解析器,它基本上可以工作,但它真正做的是过滤掉特定 class 的 Header 和数据字段 - 我真的很想能够做类似
csv.Configuration.RegisterClassMap<Class1>();
csv.Configuration.RegisterClassMap<Class2>();
var data1 = csv.GetRecords<Class1>().ToList();
var data2 = csv.GetRecords<Class2>().ToList();
并一次读取文件?这是可能的还是我使用了错误的解析器?
问候
戴夫
有办法做到这一点;你只需要手动完成。
- 您逐行手动读取csv文件
- 检查鉴别器的第一列,它将指示您需要映射到 Class 对象。
- 检查要映射到的 class 的第二列。
将整行映射到给定的 class。
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;
}
}
}
}
}
我最近一直在使用 Josh Close 的 CsvHelper 来解析 CSV 文件,我非常喜欢 class 映射的流畅 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可以处理的吗?我写了一个自定义解析器,它基本上可以工作,但它真正做的是过滤掉特定 class 的 Header 和数据字段 - 我真的很想能够做类似
csv.Configuration.RegisterClassMap<Class1>();
csv.Configuration.RegisterClassMap<Class2>();
var data1 = csv.GetRecords<Class1>().ToList();
var data2 = csv.GetRecords<Class2>().ToList();
并一次读取文件?这是可能的还是我使用了错误的解析器?
问候 戴夫
有办法做到这一点;你只需要手动完成。
- 您逐行手动读取csv文件
- 检查鉴别器的第一列,它将指示您需要映射到 Class 对象。
- 检查要映射到的 class 的第二列。
将整行映射到给定的 class。
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; } } } } }