pet*_*ter -2 c# .net-4.0 text-files
我正在阅读一个巨大的文本文件,如下所示.现在想要的是,如果我达到一个特定的单词test:在这里说,我将从该行推送到数据库的值,并通过连接10个后续行的值来输出一个值.所以我希望通过使用File. Readalllines或任何其他机制获得10个后续行并将其存储到内存中.我将如何实现它.截至目前,我正在加载整个文本文件,File.Readalllines这使得应用程序非常慢.
using (FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
string s = String.Empty;
while ((s = sr.ReadLine()) != null)
{
if (s.Contains("test:"))
{
//
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
我正在研究消费者答案,这里有一个扭曲假设我有10000行开头,test:每行都有ID,我插入一个ID的行,如果ID == ID存储在字典中,那么我必须存储成功的10行而不是总共有前10行,那怎么办呢?
编辑
@spender我这样做SkipWhile(line => (!line.Contains("ADD GTRX:") && !line.Contains(dict.CellId.ToString()))).Take(10);但没有运气
编辑 @spender最后我做了它我必须移动括号如此完整代码我做了如下所示,我删除空行也
var linesOfInterest = File.ReadLines(filename)
.SkipWhile(line => !line.Contains("test:")).SkipWhile(line => !line.Contains(dictId.ToString())).Take(10);
var output = string.Join(Environment.NewLine, linesOfInterest).Trim().Split(';').Where(arg => !string.IsNullOrWhiteSpace(arg)).ToArray();
Run Code Online (Sandbox Code Playgroud)
你很棒,祝你有个愉快的一天
File.ReadLines是你的朋友.它为您提供了一个IEnumerable<string>来自文本文件的懒惰手背线(即文件永远不会完全加载到内存中).从那里你可以很好地LINQ它.
var linesOfInterest = File.ReadLines(filePath)
.SkipWhile(line => !line.Contains(searchTerm))
.Take(10);
var output = string.Join(Environment.NewLine, linesOfInterest);
Run Code Online (Sandbox Code Playgroud)