2012-04-26 16 views
0

foreachのコードでは、例外が発生します。Linq経由のCSVファイル

私はcsv(2行目)にブレークポイントを置いて、結果を展開して、2つのエントリが表示されます。

私はforeachcsvに同じことを行うとき、私はexcpetionを得る:can't read from closed text reader.

任意のアイデア?

おかげで、

私のCSVファイル:

A0;A1;A2;A3;A4 
B0;B1;B2;B3;B4 

コード

var lines = File.ReadLines("filecsv").Select(a => a.Split(';')); 
IEnumerable<IEnumerable<MyClass>> csv = 
    from line in lines 
    select (from piece in line 
      select new MyClass 
      { 
       Field0 = piece[0].ToString(), 
       Field1 = piece[1].ToString() 
      } 
    ).AsEnumerable<MyClass>(); 

foreach (MyClass myClass in csv) 
    Console.WriteLine(myClass.Field0); 
Console.ReadLine(); 

のMyClass:LINQは直接すべて読んでいないので、それがある

public class MyClass 
{ 
    public string Field0 { get; set; } 
    public string Field1 { get; set; } 
} 

答えて

2

おそらく、このような何か代わりに、正確に何をしたいあなたを与えるだろう。

var jobs = File.ReadLines("filecsv") 
       .Select(line => line.Split(',')) 
       .Select(tokens => new MyClass { Field0 = tokens[0], Field1 = tokens[1] }) 
       .ToList(); 

あなたが持っている問題は、あなたが実行を遅らせたEnumerableを、保存しているということです。次に、デバッガを介してファイルをループし、すべての作業を行い、破棄します。それからもう一度試してみてください。

上記のコードは、現在お望みのものを実現し、ややクリーナーで、怠惰な動作がなくなるように強制的にリストに変換します。

また、from piece in lineが現在どのように正しく動作しているかわかりません。

0

Perhabsアイテム、ちょうどcそれが必要であれば読み込んだ接続を書き換えます。

あなたはキャストしようとすることができます:

var lines = File.ReadLines("filecsv").Select(a => a.Split(';')).ToArray(); 
0

私はそれが(Select()で使用)yieldキーワードの組み合わせであると(ReadLinesで)内部テキストリーダーが「同意」ではないと思います。

は、それを並べ替える必要がありますvar lines = File.ReadLines("filecsv").Select(a => a.Split(';')).ToArray();

への変数の行を変更します。

+0

私も同じと思います。 – userGS

関連する問題