2014-12-21 4 views
1

Программа предназначена для чтения информации из файла .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! 
    } 
} 
+1

Что содержит файл .csv? Это все аргументы конструктора? Можете ли вы дать нам пример .csv-файла? –

+1

у вашего конструктора продукта есть 6 полей, но ваши детали продукта имеют массив из 20? Я этого не понимаю? – SuncoastOwner

+0

Извините. CSV выглядит следующим образом; http://tinypic.com/view.php?pic=xkrasi&s=8#.VJb_w_9_gJJ – Razis

ответ

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 устранит эти проблемы для вас.

+0

Действительно. Я не думаю, что это второстепенная проблема, кстати ... на самом деле это главный вопрос OP : * «Моя проблема в том, что я понятия не имею, как передавать данные [...], хранящиеся в массиве, в объекты-конструкторы . * * – Heinzi

+0

Я думаю, что ответ Хайнци в значительной степени похож на меня. На данный момент мои знания довольно простые. Информация, которую я дал, является частью заданного нам вопроса. Разбор CSV-файла с использованием Split (',') является таким же передовым, как мы уже сейчас. Мы никогда не рассказывали о списках, но лектор бросил их, чтобы заставить нас думать немного больше, я думаю ... не то, что они, похоже, отличаются от arays и т. Д. – Razis

+0

Программа будет использовать класс Product со следующими свойствами: ID , Название, Описание, Цена, StockAvailable, WeeklySales Программа будет функционировать, предварительно прочитав информацию о продукте. Затем программа создаст несколько объектов продукта на основе этого файла и сохранит эти Продукты в списке продуктов. Затем программа будет считывать информацию о продажах из файла продаж и обновлять список продуктов еженедельным показателем продаж. Наконец, программа напишет обновленную информацию в обновленный файл сведений о продуктах, обеспечив изменение стоимости акций, чтобы отразить продажи. – Razis

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; 
} 
Смежные вопросы