从数组创建对象列表

时间:2014-12-21 17:04:54

标签: c# csv

该程序旨在从.csv文件中读取信息;然后使用此文件中的数据创建Product个对象,然后将其存储在列表中。

我的问题是,我不知道如何传输.csv文件中的数据,这些文件会被','并存储在数组中的构造函数对象中。任何帮助将不胜感激。

.csv看起来像这样:

What the .csv Looks Like

到目前为止,这是我的代码:

class Product
{
    public string ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Price { get; set; }
    public string StockAvailable { get; set; }
    public string WeeklySales { get; set; }

    // Constructor 
    public Product(string iD, string name, string Desc, string price, string StockAva, string weeklysales)
    {
        ID = iD;
        Name = name;
        Description = Desc;
        Price = price;
        StockAvailable = StockAva;
        WeeklySales = weeklysales;
    }
}

private static void ReadProductFile()
{
    string productPath = GetDataDirectory("prod");

    string[] fileData = File.ReadAllLines(productPath);

    string[] productDetails = new string[20];

    for (int i = 0; i < fileData.Length; i++)
    {
        productDetails = fileData[i].Split(',');

        // I have no idea what do do next!
    }
}

2 个答案:

答案 0 :(得分:1)

List<Product> myProducts = new List<Product>();

...

for (int i = 0; i < fileData.Length; i++)
{
    productDetails = fileData[i].Split(',');

    var p = new Product(productDetails[0],
                        productDetails[1],
                        ...
                        productDetails[5]));
    myProducts.Add(p);
}

正如其他人所提到的,Split(',')不是解析CSV文件最可靠的方式 - 如果产品说明包含,怎么办?使用正确的C# CSV parser将为您解决这些问题。

答案 1 :(得分:0)

这很简单,但要求您事先知道csv文件中字段的顺序。一旦你知道了,只需要读取所有特定字段并将它们发送到Product类的构造函数(幸运的是已经接受了字段值)。

您应该使用CSV阅读器执行此任务。这将使解析和读取单个字段值变得更加容易。 .NET类库中有一个内置的CSV解析器。有关详细信息和用法,请参阅this SO post

如果您使用CSV解析器,您的功能将如下所示:

private static List<Product> ReadProductFile()
{
    string productPath = GetDataDirectory("prod");

    if(!System.IO.File.Exists(productPath)) return null;

    var lst = new List<Product>();

    TextFieldParser parser = new TextFieldParser(productPath);
    parser.TextFieldType = FieldType.Delimited;
    parser.SetDelimiters(",");

    while (!parser.EndOfData) 
    {
        string[] fields = parser.ReadFields();
        foreach (string field in fields) 
        {
            try
            {
                //assuming that the order of fields in the CSV file is the same as the 
                //order of arguments of Product's constructor.
                Product p = new Product(field[0], field[1], ...);
                lst.Add(p);
            }
            catch(Exception ee)
            {
                //Log error somewhere and continue with the rest of the CSV
            }
        }
    }

    parser.Close();

    return lst;
}