2012-04-26 3 views
0

Avec le code ci-dessous, sur le foreach, j'obtiens une exception.Fichier CSV en classe via Linq

Je place le point d'arrêt sur le csv (deuxième ligne), je développe le résultat, je vois 2 entrées c'est ok.

Quand je fais la même chose sur le csv dans le foreach, je reçois un excpetion: can't read from closed text reader.

Toute idée?

Merci,

Mon fichier CSV:

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

Le code

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:

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

Répondre

2

Peut-être quelque chose comme ça à la place, vous donnera exactement ce que vous voulez:

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

Le problème que vous avez est que vous enregistrez le Enumerable, ce qui a retardé l'exécution. Vous le regardez ensuite à travers le débogueur, qui parcourt le fichier, fait tout le travail et s'en débarrasse. Ensuite, vous essayez et recommencez.

Le code ci-dessus atteint ce que vous voulez actuellement, est un peu plus propre et force la conversion en une liste de sorte que le comportement paresseux a disparu.

Notez également que je ne vois pas comment votre from piece in line pourrait fonctionner correctement tel qu'il est actuellement.

0

Perhabs c'est parce que LINQ ne lit pas directement toutes les articles, juste c répète la connexion lue si nécessaire.

Vous pouvez essayer de lancer:

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

Je pense qu'il est une combinaison du mot-clé yield (utilisé dans Select()) et le lecteur de texte interne (en ReadLines) pas « d'accord ».

Modifie les lignes variables à var lines = File.ReadLines("filecsv").Select(a => a.Split(';')).ToArray();

Cela devrait faire le tri.

+0

Je pense aussi la même chose. – userGS