2010-04-27 1 views
3

J'ai un fichier texte (Désolé, je ne suis pas autorisé à travailler sur des fichiers XML :() et comprend les dossiers des clients Chaque fichier texte ressemble à:Linq fichiers texte

Account_ID: 98734BLAH9873 
User Name: something_85 
First Name: ILove 
Last Name: XML 
Age: 209 

etc. .. Et j'ai besoin d'être en mesure d'utiliser LINQ pour obtenir les données de ces fichiers texte et juste les stocker en mémoire

J'ai vu beaucoup de Linq à SQL, Linq à BLAH mais rien pour Linq à texte. s'il vous plaît aidez-moi dehors abit?

Merci

Répondre

12

Vous pouvez utiliser le code comme ça

var pairs = File.ReadAllLines("filename.txt") 
    .Select(line => line.Split(':')) 
    .ToDictionary(cells => cells[0].Trim(), cells => cells[1].Trim()) 

Ou utilisez la méthode 4.0 File.ReadLines() .NET pour retourner un IEnumerable, qui est utile pour le traitement des gros fichiers texte.

6

Le concept d'une source de données de fichier texte est extrêmement large (considérez que XML est stocké dans des fichiers texte). Pour cette raison, je pense qu'il est peu probable qu'une telle bête existe.

Il devrait être assez simple pour lire le fichier texte dans une collection d'objets de compte, puis utiliser LINQ-to-Objects.

5

FileHelpers est une très bonne solution open source à ceci:

http://filehelpers.sourceforge.net/

Vous venez de déclarer une classe avec des attributs et FileHelpers lit le fichier plat pour vous:

[FixedLengthRecord] 
public class PriceRecord 
{ 
    [FieldFixedLength(6)] 
    public int ProductId; 

    [FieldFixedLength(8)] 
    [FieldConverter(typeof(MoneyConverter))] 
    public decimal PriceList; 

    [FieldFixedLength(8)] 
    [FieldConverter(typeof(MoneyConverter))] 
    public decimal PriceOnePay; 
} 

Une fois FileHelpers vous renvoie un tableau de lignes, vous pouvez utiliser Linq à objets pour interroger les données

Nous avons eu super su J'accepte avec. En fait, je pense que la solution de Kaerber est une solution simple, peut-être capable de migrer vers FileHelpers jusqu'à ce que vous ayez vraiment besoin de la puissance supplémentaire.

+0

C'est une très bonne solution. – Contango

2

L'exemple suivant est quelque peu artificiel; il pourrait être implémenté avec une seule expression de requête, mais je voulais utiliser deux expressions de requête pour démontrer la paresse du traitement. Aucune ligne n'est lue à partir du fichier texte jusqu'à ce que le programme itère sur les résultats de la deuxième expression de requête.

L'implémentation est triviale. La liste suivante contient à la fois la méthode d'extension ainsi que le code à utiliser la méthode d'extension:

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Text; 
using System.IO; 
using System.Linq; 

namespace LinqToText 
{ 
    public static class StreamReaderSequence 
    { 
    public static IEnumerable<string> Lines(this StreamReader source) 
    { 
     String line; 

     if (source == null) 
      throw new ArgumentNullException("source"); 
     while ((line = source.ReadLine()) != null) 
     { 
     yield return line; 
     } 
    } 
    } 

    class Program 
    { 
    static void Main(string[] args) 
    { 
     StreamReader sr = new StreamReader("TextFile.txt"); 

     var t1 = 
     from line in sr.Lines() 
     let items = line.Split(',') 
     where ! line.StartsWith("#") 
     select String.Format("{0}{1}{2}", 
      items[1].PadRight(16), 
      items[2].PadRight(16), 
      items[3].PadRight(16)); 

     var t2 = 
     from line in t1 
     select line.ToUpper(); 

     foreach (var t in t2) 
     Console.WriteLine(t); 

     sr.Close(); 
    } 
    } 
} 

Si vous exécutez cet exemple avec le fichier texte suivant:

#This is a comment 
1,Eric,White,Writer 
2,Bob,Jones,Programmer 
3,Orville,Wright,Inventor 
4,Thomas,Jefferson,Statesman 
5,George,Washington,President 

Il produit la sortie suivante.

ERIC   WHITE   WRITER 
BOB    JONES   PROGRAMMER 
ORVILLE   WRIGHT   INVENTOR 
THOMAS   JEFFERSON  STATESMAN 
GEORGE   WASHINGTON  PRESIDENT