使用LINQ处理文本文件

本文关键字:文件 文本 处理 LINQ 使用 | 更新日期: 2023-09-27 18:21:59

文本文件格式

headerinfo="abc"**第1部分=001**元素1element2。。。。。。。元素15end_element**第2部分=002**元素1element2。。。。。。。emelent15end_element。。。。。。end_header

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

到目前为止,我有:

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

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

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

使用LINQ处理文本文件

我想您正在寻找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<String> 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)在那里跳过第一部分的标题。删除它,因为你似乎想保留这条线。

public static IEnumerable<string> 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<string> linesICareABout = new List<string>();
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