Linq到文本文件

我有一个文本文件(抱歉,我不允许处理XML文件:(),它包括客户记录。每个文本文件如下所示:

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

等等……我需要能够使用LINQ从这些文本文件中获取数据,并将它们存储在内存中。

我见过很多Linq to SQL,Linq到BLAH,但没有Linq to Text。 有人可以请我帮助我吗?

谢谢

你可以使用这样的代码

 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,这对处理大文本文件很有用。

文本文件数据源的概念非常广泛(考虑到XML存储在文本文件中)。 出于这个原因,我认为这样的野兽不太可能存在。

它应该很简单,将文本文件读入Account对象的集合,然后使用LINQ-to-Objects。

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

一旦FileHelpers为您提供了一系列行,您就可以使用Linq to Objects来查询数据

我们取得了巨大的成功。 我实际上认为Kaerber的解决方案是一个很好的简单解决方案,可能会迁移到FileHelpers,直到你真的需要额外的function。

以下示例有点人为; 它可以用单个查询表达式实现,但我想使用两个查询表达式来演示处理的懒惰。 在程序迭代第二个查询表达式的结果之前,不会从文本文件中读取任何行。

实施是微不足道的。 以下清单包含扩展方法以及使用扩展方法的代码:

 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 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