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

Tim*_*Tim 6 c# csv serialization

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

我被要求将测试数据加载到CSV文件中的对象集合中.(CSV优于xml,因为它对人类来说更简单易读.我们正在创建测试数据来运行单元测试)

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

List<MyObject>
Run Code Online (Sandbox Code Playgroud)

MyObject是一个包含一些双精度和一些int的类.

这样做的首选方法是什么?我认为我不需要序列化其中一个对象.

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

eri*_*icb 7

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

对于任何使用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);
            }
        }
    }
}  
Run Code Online (Sandbox Code Playgroud)


Mrc*_*ief 5

讨厌给出链接,但是此链接提供了您正在寻找的确切示例:http : //msdn.microsoft.com/zh-cn/library/bb513866.aspx#Y154