使用LINQ处理文本文件

文本文件格式

 headerinfo =“abc”
 ** part1的= 001 **
部件1
在element2 ....
 ...
 element15
 END_ELEMENT
 **第2部分002 = **
部件1
在element2 ....
 ...
 emelent15
 END_ELEMENT
 ......
 end_header

我想从part1=001开始选择所有文本行,但不包括part2=002

到目前为止我有:

 var res = (from line in File.ReadAllLines(sExecPath + @"\" + sFileName) where line == "part1=001" select line).ToList(); 

我试图在linq中使用选项之间,它似乎没有返回任何结果。

 var part1= (from prt in File.ReadAllLines(sExecPath + @"\" + sFileName) where prt.CompareTo("part1=001") >=0 && prt.CompareTo("part=002") >= 0 select prt); 

我想你正在寻找TakeWhile :

 var linesInPartOne = File .ReadAllLines(sExecPath + @"\" + sFileName) .SkipWhile(line => !line.StartsWith("**part1=")) // To skip to part 1 header line, uncomment the line below: // Skip(1) .TakeWhile(line => !line.StartsWith("**part2=")); 

为了概括这个来检索任何给定的编号部分,这样的事情会做:

 public static IEnumerable ReadHeaderPart(String filePath, int part) { return File .ReadAllLines(filePath) .SkipWhile(line => !line.StartsWith("**part" + part + "=")) // To skip to part 1 header line, uncomment the line below: // Skip(1) .TakeWhile(line => !line.StartsWith("**part" + (part + 1) + "=" && !line.StartsWith("end_header"))) .ToList(); } 

编辑:我有跳过(1)跳过第1部分标题。 删除它,因为你似乎想要保持这一行。

 public static IEnumerable GetLinesBetween( string path, string fromInclusive, string toExclusive) { return File.ReadLines(path) .SkipWhile(line => line != fromInclusive) .TakeWhile(line => line != toExclusive); } var path = Path.Combine(sExecPath, sFileName); // don't combine paths like that var result = GetLinesBetween(path, "part1=001", "part2=002").ToList(); 

最简单和最直接的解决方案是我这样的:

 var lines = File.ReadAllLines(@"C:\Sample.txt"). SkipWhile(line=>!line.Contains("part1")). Skip(1).TakeWhile(line=>!line.Contains("part2")); 

它返回您想要的结果。 逻辑很简单:

  • SkipWhile行直到遇到包含“part1”的行
  • Skip(1) (因为它实际上是包含“part1”字符串的那个)
  • 最后Take这些直到到达包含“part2”的行。

Linq可能不是你最好的选择。 试试吧

 var lines = File.ReadAllLines(filename); List linesICareABout = new List(); for(int i = 0; !linesICareAbout[i].Contains("part2=002"); ++i) { linesICareABout.Add(lines[i]); } 

然后用你读过的线做任何你想做的事。

但是,如果您真的致力于使用Linq,请尝试TakeWhile

http://msdn.microsoft.com/en-us/library/bb534804.aspx