C# 使用LINQ处理文本文件
文本文件格式 headerinfo = "abc" **part1=001** element1 element2.... ... element15 end_element **part2=002** element1 element2.... ... emelent15 end_element ...... end_header 我试图在linq中使用between选项,它似乎不会返回任何结果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
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"));
它返回您实际想要的结果。
逻辑很简单:
行,直到遇到包含“part1”的行SkipWhile
- 在
(实际上是包含“part1”字符串的那一个)之后跳过(1)
- 最后取下那些,直到到达包含“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"));