如何使用 CsvHelper 从 .csv 文件的多个对象中检索数据?
How can I retrieve data from multiple objects from a .csv file using CsvHelper?
我有一个类型为 MyClass 的列表,MyClass 有几个属性。
如果 .csv 文件看起来像这样,我如何使用 CsvHelper 检索数据? (是的,Data1 类型的属性已编号。)
日期 |数据1 |单位 |数据2 |单位 |数据3 |单位 | ... |数据N |单元
----------|------------|--------|----------|--------| ----------|--------|-----|----------|----------
2020.01.02 | 1 |千瓦 | 3 |千瓦 | 1.5 |千瓦 | ... | 0 |千瓦
2020.01.03 | 0 |千瓦 | 4 |千瓦 | 1 |千瓦 | ... | 3 |千瓦
2020.01.04 | 4 |千瓦 | 2 |千瓦 | 1 |千瓦 | ... | 2 |千瓦
这就是我想看到的。对象存储在可以存储 MyClass 类型的列表中。
List(MyClass) = [Object-1, Object-1, Object-3, ..., Object-N]
Object-1: [(2020.01.02.,1, kW),(2020.01.03.,0, kW),,(2020.01.04.,4, kW)]
Object-2: [(2020.01.02.,3, kW),(2020.01.03.,4, kW),,(2020.01.04.,2, kW)]
Object-3: [(2020.01.02.,1.5, kW),(2020.01.03.,1, kW),,(2020.01.04.,1, kW)]
...
Object-N: [(2020.01.02.,0, kW),(2020.01.03.,3, kW),,(2020.01.04.,2, kW)]
MappedClass{
private DateTime Date;
private List List;
}
MyClass{
private DateTime Date;
private string A1; //Attribute1
private int A2; //Attribute2
}
如果只列出了一个对象的属性,那么我可以完成任务,但不能处理多个对象和此布局。
我想到逐行读取文件,然后以某种方式将其相关数据配对。
如何有效地完成这项任务?
这是一种方法。
public class Program
{
public static void Main(string[] args)
{
using (MemoryStream stream = new MemoryStream())
using (StreamWriter writer = new StreamWriter(stream))
using (StreamReader reader = new StreamReader(stream))
using (CsvReader csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
writer.WriteLine("Date,Data1,Unit,Data2,Unit,Data3,Unit");
writer.WriteLine("2020.01.02,1,kw,3,kw,1.5,kw");
writer.WriteLine("2020.01.03,0,kw,4,kw,1,kw");
writer.Flush();
stream.Position = 0;
var records = new List<MappedClass>();
csv.Read();
csv.ReadHeader();
while (csv.Read())
{
var record = new MappedClass
{
Date = record.Date,
Date = csv.GetField<DateTime>(0),
List = new List<MyClass>()
};
for (int i = 1; i < csv.Context.HeaderRecord.Length; i += 2)
{
var item = new MyClass
{
Data = csv.GetField<decimal>(i),
Unit = csv.GetField<string>(i + 1)
};
record.List.Add(item);
}
records.Add(record);
}
}
}
}
public class MappedClass
{
public DateTime Date { get; set; }
public List<MyClass> List { get; set; }
}
public class MyClass {
public DateTime Date;
public string Unit; //Attribute1
public decimal Data; //Attribute2
}
我有一个类型为 MyClass 的列表,MyClass 有几个属性。 如果 .csv 文件看起来像这样,我如何使用 CsvHelper 检索数据? (是的,Data1 类型的属性已编号。)
日期 |数据1 |单位 |数据2 |单位 |数据3 |单位 | ... |数据N |单元 ----------|------------|--------|----------|--------| ----------|--------|-----|----------|---------- 2020.01.02 | 1 |千瓦 | 3 |千瓦 | 1.5 |千瓦 | ... | 0 |千瓦 2020.01.03 | 0 |千瓦 | 4 |千瓦 | 1 |千瓦 | ... | 3 |千瓦 2020.01.04 | 4 |千瓦 | 2 |千瓦 | 1 |千瓦 | ... | 2 |千瓦
这就是我想看到的。对象存储在可以存储 MyClass 类型的列表中。
List(MyClass) = [Object-1, Object-1, Object-3, ..., Object-N]
Object-1: [(2020.01.02.,1, kW),(2020.01.03.,0, kW),,(2020.01.04.,4, kW)]
Object-2: [(2020.01.02.,3, kW),(2020.01.03.,4, kW),,(2020.01.04.,2, kW)]
Object-3: [(2020.01.02.,1.5, kW),(2020.01.03.,1, kW),,(2020.01.04.,1, kW)]
...
Object-N: [(2020.01.02.,0, kW),(2020.01.03.,3, kW),,(2020.01.04.,2, kW)]
MappedClass{
private DateTime Date;
private List List;
}
MyClass{
private DateTime Date;
private string A1; //Attribute1
private int A2; //Attribute2
}
如果只列出了一个对象的属性,那么我可以完成任务,但不能处理多个对象和此布局。 我想到逐行读取文件,然后以某种方式将其相关数据配对。
如何有效地完成这项任务?
这是一种方法。
public class Program
{
public static void Main(string[] args)
{
using (MemoryStream stream = new MemoryStream())
using (StreamWriter writer = new StreamWriter(stream))
using (StreamReader reader = new StreamReader(stream))
using (CsvReader csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
writer.WriteLine("Date,Data1,Unit,Data2,Unit,Data3,Unit");
writer.WriteLine("2020.01.02,1,kw,3,kw,1.5,kw");
writer.WriteLine("2020.01.03,0,kw,4,kw,1,kw");
writer.Flush();
stream.Position = 0;
var records = new List<MappedClass>();
csv.Read();
csv.ReadHeader();
while (csv.Read())
{
var record = new MappedClass
{
Date = record.Date,
Date = csv.GetField<DateTime>(0),
List = new List<MyClass>()
};
for (int i = 1; i < csv.Context.HeaderRecord.Length; i += 2)
{
var item = new MyClass
{
Data = csv.GetField<decimal>(i),
Unit = csv.GetField<string>(i + 1)
};
record.List.Add(item);
}
records.Add(record);
}
}
}
}
public class MappedClass
{
public DateTime Date { get; set; }
public List<MyClass> List { get; set; }
}
public class MyClass {
public DateTime Date;
public string Unit; //Attribute1
public decimal Data; //Attribute2
}