Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ处理文本文件_C#_Linq - Fatal编程技术网

C# 使用LINQ处理文本文件

C# 使用LINQ处理文本文件,c#,linq,C#,Linq,文本文件格式 headerinfo = "abc" **part1=001** element1 element2.... ... element15 end_element **part2=002** element1 element2.... ... emelent15 end_element ...... end_header 我试图在linq中使用between选项,它似乎不会返回任何结果 var part1= (from prt in File.ReadAllLines(sExecPa

文本文件格式

headerinfo = "abc" **part1=001** element1 element2.... ... element15 end_element **part2=002** element1 element2.... ... emelent15 end_element ...... end_header 我试图在linq中使用between选项,它似乎不会返回任何结果

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

我认为您正在寻找:

要将其推广到检索任何给定编号的零件,可以执行以下操作:

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();
 }
公共静态IEnumerable ReadHeaderPart(字符串文件路径,int部分){
返回文件
.ReadAllLines(文件路径)
.SkipWhile(line=>!line.StartsWith(“**部分”+部分+”=”)
//要跳到第1部分标题行,请取消注释下面的行:
//跳过(1)
.TakeWhile(行=>
!line.StartsWith(“**部分”+(部分+1)+”=”
&& 
!line.StartsWith(“end_头”))
.ToList();
}

编辑:我有一个跳过(1)在那里跳过第1部分的标题。删除了它,因为您似乎想保留该行。

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]);
}
var lines=File.ReadAllLines(文件名);
List linesICareABout=新列表();
对于(int i=0;!linesICareAbout[i]。包含(“part2=002”);+i)
{
linesICareABout.添加(第[i]行);
}
然后用你读到的句子做任何你想做的事

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

公共静态IEnumerable GetLinesBetween(
字符串路径,
字符串fromInclusive,
字符串(排除)
{
返回文件.ReadLines(路径)
.SkipWhile(line=>line!=fromInclusive)
.TakeWhile(line=>line!=toExclusive);
}
var path=path.Combine(sExecPath,sFileName);//不要这样组合路径
var result=GetLinesBetween(路径,“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”的行
  • 之后跳过(1)
    (实际上是包含“part1”字符串的那一个)
  • 最后取下那些,直到到达包含“part2”的行

您是否应该使用
SkipWhile
跳过“part1”的所有行(在这种特殊情况下只有一行)?…我猜下一个问题是“如何获得part2和part3之间的所有行”…:-)编辑以阻止这种可能性;-)克里斯:为什么不使用一种方法
ReadFilePart
,它的参数
startPart
endPart
可以用于任何文件?;-)当我在做的时候,我会在早上做函数make me coffee:-)我试过了,因为它使用了几行代码:-)。工作得很有魅力。
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]);
}
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"));