2010-04-27 2 views
3

У меня есть текстовый файл (К сожалению, я не разрешено работать с файлами XML :(), и включает в себя записи о клиентах Каждый текстовый файл выглядит следующим образом:Linq To Text Files

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

и т.д. .. И мне нужно иметь возможность использовать LINQ для получения данных из этих текстовых файлов и просто хранить их в памяти.

Я видел много Linq to SQL, Linq для BLAH, но ничего для Linq для текста. пожалуйста, помогите мне выйти?

Спасибо

ответ

12

Вы можете использовать код, подобный этому

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

Или использовать метод .NET 4.0 File.ReadLines(), чтобы вернуть IEnumerable, который полезен для обработки больших текстовых файлов.

6

Концепция источника текстовых файлов чрезвычайно широка (считают, что XML хранится в текстовых файлах). По этой причине, я думаю, маловероятно, что такой зверь существует.

Это должно быть достаточно простым, чтобы прочитать текстовый файл в коллекции объектов Account, а затем использовать LINQ-to-Objects.

5

Filehelpers это действительно отличное решение с открытым исходным кодом для этого:

http://filehelpers.sourceforge.net/

Вы просто объявить класс с атрибутами, и FileHelpers читает плоский файл для вас:

[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; 
} 

Once FileHelpers возвращает вам массив строк, вы можете использовать Linq для объектов для запроса данных

У нас был отличный su ccess с ним. Я на самом деле думаю, что решение Kaerber - это простое простое решение, возможно, переход на FileHelpers, пока вам не понадобится дополнительная мощность.

+0

Это действительно приятное решение. – Contango

2

Следующий пример несколько искусственный; он может быть реализован с помощью одного выражения запроса, но я хотел использовать два выражения запроса, чтобы продемонстрировать ленивость обработки. Никакие строки не читаются из текстового файла до тех пор, пока программа не повторится по результатам второго выражения запроса.

Реализация тривиальная. Следующий список содержит как метод расширения, а также код для использования методы расширения:

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

Если запустить этот пример со следующим текстом файлом:

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

Он производит следующий вывод.

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