【问题标题】:(de)Serialize from CSV to an object (or preferably a list of type object)(de)从 CSV 序列化到对象(或者最好是对象类型的列表)
【发布时间】:2011-07-14 03:36:56
【问题描述】:

(我是一名 C++ 程序员 - 正在尝试学习 C# - 似乎有一些内置的对象序列化 - 但我在这里有点没水了......)

有人要求我将测试数据从 CSV 文件加载到对象集合中。 (CSV 比 xml 更受欢迎,因为它对人类来说更简单易读。我们正在创建测试数据来运行单元测试)

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

List<MyObject>

其中 MyObject 是一个包含一些双精度数和一些整数的类。

执行此操作的首选方法是什么?我认为我永远不需要序列化这些对象之一。

我希望单行代表一个对象,文件中的一组行用于制作列表/集合。

【问题讨论】:

    标签: c# serialization csv


    【解决方案1】:

    下面应该可以解决问题,几个月前我刚刚为我正在从事的数据转换项目做了这个。

    对于任何使用 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);
                }
            }
        }
    }  
    

    【讨论】:

    • 带标题的 CSV 文件是什么意思?如果我的数据不是以逐列方式组织的,但我仍想解析数据怎么办?
    【解决方案2】:

    不想提供链接,但这个链接有您正在寻找的确切示例:http://msdn.microsoft.com/en-us/library/bb513866.aspx#Y154

    【讨论】:

    • 这显示用逗号分割项目。不推荐用于可能具有包含逗号的带引号字符串的数据字段。使用 CsvReader 查看上面的其他答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 2012-01-29
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2015-10-15
    相关资源
    最近更新 更多