(反)从CSV序列化到对象(或者最好是对象类型的列表)

本文关键字:对象 类型 列表 或者 CSV 序列化 | 更新日期: 2023-09-27 18:01:57

(我是一个c++程序员-试图学习c# -它似乎有一些内置的对象序列化-但我在这里有点出水…)

我被要求将测试数据加载到CSV文件中的对象集合中。(CSV比xml更受欢迎,因为它对人类来说要简单得多,而且可读性强。我们正在创建测试数据以运行单元测试)

集合将是一个(简单)对象列表。

List<MyObject>

其中MyObject是一个包含几个double类型和几个int类型的类。

首选的方法是什么?我认为我永远不需要序列化这些对象中的任何一个。

我希望一行代表一个对象,文件中的这组行用于创建列表/集合。

(反)从CSV序列化到对象(或者最好是对象类型的列表)

下面应该可以做到这一点,几个月前我正在做的数据转换项目就是这样做的。

对于任何使用CSV(或任何以字符分隔的字符串)的人来说,一个重要的提示是,您真的应该考虑使用适合它的特定库。下面是我发现的最流行的一个(非常可靠)

您将从string.Split(',')开始,然后当有人不小心在您的测试数据文件中抛出逗号时,您该怎么办?…这只是一个接一个的噩梦,这个库已经为你遍历了大部分:

http://www.codeproject.com/KB/database/CsvReader.aspx?msg=3227161

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