2010-11-08 27 views
0

J'ai un fichier csv avec 160 colonnes et plusieurs lignes de données de ligne (noms de la première colonne, 2ème et autres données). Les colonnes sont séparées par un; et les lignes par,obtenir des données de csv par nom de colonne avec LINQ

Lorsque vous ouvrez le fichier dans Excel est formaté comme celui-ci par exemple:

A B C D E F 
1 2 3 4 5 6 
7 8 9 10 11 12 

Je veux lire le fichier CSV en C# et utilisation LINQ autant que possible.

(modifier) ​​ Comment puis-je obtenir les valeurs de la ligne comme string [] pour la ligne qui a dans la colonne « E » la valeur 5 par exemple? Cela devrait retourner les valeurs de chaîne [] de la 2ème rangée. J'utilise C# 4.0 dans VS2010.

Répondre

0

Vous pouvez interroger une feuille de calcul en tant que source de données "classique" comme Sql Server. Créez une chaîne de connexion pointant vers le chemin de votre fichier et utilisez le fournisseur Microsoft.jet.oledb.4.0 (il n'est pas disponible sur x64 os, dans ce cas vous devrez utiliser un composant tiers pour établir la connexion). Une fois cela fait, vous pouvez exécuter des instructions sql sur votre .xls. Vous ne pouvez pas exécuter des requêtes en utilisant LINQ directement sur les xls comme vous le faites normalement en utilisant LINQ to SQL (le datacontext ne peut être créé que sur un serveur sql). Pour accéder à la valeur d'une colonne sur une ligne, après la requête, vous devez itérer sur le retour datareader:

using (DbDataReader dr = command.ExecuteReader()) 
    { 
     while (dr.Read()) 
     { 
      string result = dr["E"].ToString(); 
     } 
    } 

Vous trouverez ici quelques infos utiles: http://www.davidhayden.com/blog/dave/archive/2006/05/26/2973.aspx

Hope it helps

0

Vous pouvez créer une fonction d'extension comme ceci:

public static IEnumerable<T> RowValuesFromColumnID<T>(this IEnumerable<IEnumerable<T>> source, T columnID) { 
     var index = source.First().Select((x,i) => new { x, i }).Where(x => x.x.Equals(columnID)).FirstOrDefault().i; 
     return source.Skip(1).SelectMany(x => x.Where((y,i) => i == index)); 
    } 

Et puis obtenir le tableau de chaînes comme ceci:

//read in file 
    var csv = "A;B;C;D;E;F,1;2;3;4;5;6,7;8;9;10;11;12"; 

    csv.Split(',').Select(x => x.Split(';')).RowValuesFromColumnID("E").ToArray(); 

qui retournera

5 
11 

REMARQUE: La fonction d'extension ci-dessus fournit la manipulation aucune erreur que ce soit et anticipe entrée parfaite (il attend le premier IEnumerable être les noms de colonnes) . Vous voudrez probablement ajouter des vérifications nulles (entre autres choses), mais j'espère que cela vous aidera à démarrer.

S'il vous plaît laissez-moi savoir si j'ai mal compris quelque chose à propos de la question ou s'il y a des problèmes!