2013-03-06 3 views
-1

Я пытаюсь добавить некоторые элементы Csv к списку Alimento, где Alimento объявлен как:Получить один элемент CSV файл

namespace ContaCarboidrati 
{ 
    class Alimento 
    { 
     public virtual string Codice { get; set; } 
     public virtual string Descrizione { get; set; } 
     public virtual int Carboidrati { get; set; } 
    } 
} 

Мой CSV выглядит следующим образом:

"C00, Pasta, 75" ,

Вот метод, который должен создать список из CSV:

private static List<Alimento> CreaListaAlimentiDaCsv() 
{   
    List<Alimento> listaCsv = new List<Alimento>(); 
    StreamReader sr = new StreamReader(@"C:\Users\Alex\Documents\RecordAlimenti.csv"); 
    string abc = sr.ReadLine(); 
    //listaCsv = abc.Split(","); 
} 

АВС "C00, макаронные изделия, 75". Я хочу получить один элемент, чтобы добавить его в список, или добавить все 3 элемента в список, я думал, что один элемент проще сделать.

Извините за мой плохой английский

Заранее спасибо

Alex

+0

А в чем проблема с комментариями, вы должны с помощью метода Split? Split возвращает массив, поэтому listaCsv [], но в остальном это кажется прекрасным. Затем вы будете проходить через массив и назначать каждый элемент Codice, Descrizione и Carboidrati. Или я не понимаю? – Melanie

+0

Для работы с CSV лучше использовать некоторую библиотеку, например [FileHelpers] (http://filehelpers.sourceforge.net/). – publicgk

+0

CSV-записи могут охватывать несколько строк (у вас могут быть разрывы строк в цитируемых полях), чтение строк за строкой не поможет. – Joey

ответ

3

Вы на правильном пути, но вы не можете просто создать Alimento из трех строк, которая является то, что вы получите, если вы делаете abc.Split (","). Вам необходимо создать новый объект Alimento для каждого элемента (строки) в файле csv и правильно инициализировать каждый объект. Что-то вроде этого:

var item = abc.Split(','); 
listaCsv.Add(new Alimento() { Codice = item[0], Descrizione = item[1], 
Carboidrati = int.Parse(item[2])}; 

Кроме того, ваш CSV, кажется, включает пробелы после запятых, которые вы можете захотеть избавиться. Вы можете использовать string.Trim(), чтобы избавиться от ведущих/конечных пробелов. Вы также должны убедиться, что третий элемент на самом деле является целым числом и принять меры, если это не так (например, добавить некоторые ошибки).

Как замечание, реализация csv-считывателя не такая тривиальная, как можно подумать, но есть несколько бесплатных реализаций C#. Если вам нужно что-то немного более продвинутый, чем просто чтение простой (и строго однострочный-за единицу) CSV, попробуйте один из них:

+0

+1 для обеспечения простого решения, которое соответствует его существующему коду – bas

+0

Он дает ошибку con "var item = abc.Split (","); " аргумент 1: невозможно отличить от" string "до" Char [] " – user1711154

+0

@ user1711154 использовать одинарные кавычки (как он только что редактировал) – bas

1

Вы можете файл разбора с LINQ

var listaCsv = (from line in File.ReadAllLines("RecordAlimenti.csv") 
       let items = line.Split(',') 
       select new Alimento { 
         Codice = items[0], 
         Descrizione = items[1], 
         Carboidrati = Int32.Parse(items[2]) 
       }).ToList(); 
0

Вы можете легко разобрать его, считая, что ваши данные не плохие.

private IEnumerable<Alimento> CreaListaAlimentiDaCsv(string fileName) 
{   
    return File.Readlines(fileName) //@"C:\Users\Alex\Documents\RecordAlimenti.csv" 
       .Select(line => line.Split(',').Trim()) 
       .Select(
        values => 
         new Alimento 
          { 
           Codice = value[0], 
           Descrizione = values[0], 
           Carboidrati = Convert.ToInt32(values[3]) 
          }); 
} 

Вы также можете использовать Linq на методе такой как

//Takes one line without iterating the entire file 
CreaListaAlimentiDaCsv(@"C:\Users\Alex\Documents\RecordAlimenti.csv").Take(1); 

//Skips the first line and takes the second line reading two lines total 
CreaListaAlimentiDaCsv(@"C:\Users\Alex\Documents\RecordAlimenti.csv").Skip(1).Take(1);