-1

Alimentoのリストにいくつかのcsv要素を追加しようとしています。Alimentoは次のように宣言されています。

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(",");
}

abcは「C00、パスタ、75」です。単一の要素を取得してリストに追加するか、3つの要素すべてをリストに追加したいのですが、単一の要素を作成する方が簡単だと思いました。

私の悪い英語でごめんなさい

前もって感謝します

アレックス

4

3 に答える 3

4

あなたは正しい方向に進んでいますが、3つの文字列のAlimentoを作成することはできません。これは、abc.Split( "、")を実行した場合に得られるものです。csvファイルのアイテム(行)ごとに新しいAlimentoオブジェクトを作成し、各オブジェクトを正しく初期化する必要があります。このようなもの:

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

また、csvには、削除したいコンマの後にスペースが含まれているようです。string.Trim()を使用して、先頭/末尾のスペースを取り除くことができます。また、3番目の項目が実際に整数であることを確認し、そうでない場合はアクションを実行する必要があります(つまり、エラー処理を追加します)。

ちなみに、csvリーダーの実装は思ったほど簡単ではありませんが、無料のC#実装がいくつかあります。単純な(厳密にはアイテムごとに1行の)csvを読み取るよりも少し高度なものが必要な場合は、次のいずれかを試してください。

于 2013-03-06T21:46:22.760 に答える
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();
于 2013-03-06T21:46:41.077 に答える
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);
于 2013-03-06T21:51:57.240 に答える