(反)从CSV序列化到对象(或者最好是对象类型的列表)
本文关键字:对象 类型 列表 或者 CSV 序列化 | 更新日期: 2023-09-27 18:01:57
(我是一个c++程序员-试图学习c# -它似乎有一些内置的对象序列化-但我在这里有点出水…)
我被要求将测试数据加载到CSV文件中的对象集合中。(CSV比xml更受欢迎,因为它对人类来说要简单得多,而且可读性强。我们正在创建测试数据以运行单元测试)
集合将是一个(简单)对象列表。
List<MyObject>
其中MyObject是一个包含几个double类型和几个int类型的类。
首选的方法是什么?我认为我永远不需要序列化这些对象中的任何一个。
我希望一行代表一个对象,文件中的这组行用于创建列表/集合。
下面应该可以做到这一点,几个月前我正在做的数据转换项目就是这样做的。
对于任何使用CSV(或任何以字符分隔的字符串)的人来说,一个重要的提示是,您真的应该考虑使用适合它的特定库。下面是我发现的最流行的一个(非常可靠)
您将从string.Split(',')
开始,然后当有人不小心在您的测试数据文件中抛出逗号时,您该怎么办?…这只是一个接一个的噩梦,这个库已经为你遍历了大部分:
using System.IO;
using LumenWorks.Framework.IO.Csv;
static class Program
{
public class MyObject
{
public int Prop1 { get; set; }
public string Prop2 { get; set; }
public decimal Prop3 { get; set; }
}
void ReadCsv()
{
//holds the property mappings
Dictionary<string, int> myObjectMap = new Dictionary<string, int>();
List<MyObject> myObjectList = new List<MyObject>();
// open the file "data.csv" which is a CSV file with headers
using (CsvReader csv = new CsvReader(new StreamReader("data.csv"), true))
{
int fieldCount = csv.FieldCount;
string[] headers = csv.GetFieldHeaders();
for (int i = 0; i < fieldCount; i++)
{
myObjectMap[headers[i]] = i; // track the index of each column name
}
while (csv.ReadNextRecord())
{
MyObject myObj = new MyObject();
myObj.Prop1 = csv[myObjectMap["Prop1"]];
myObj.Prop2 = csv[myObjectMap["Prop2"]];
myObj.Prop3 = csv[myObjectMap["Prop3"]];
myObjectList.Add(myObj);
}
}
}
}
讨厌给出链接,但这个有你正在寻找的确切示例:http://msdn.microsoft.com/en-us/library/bb513866.aspx#Y154