我正在阅读一个巨大的文本文件,如下所示。现在想要的是,如果我在这里找到一个特定的单词test:
,我会将值从该行推送到数据库,并从中输出一个值连接10个后续行的值。所以我希望得到10个后续行,并使用File. Readalllines
或任何其他机制将其存储到内存中。如何实现它。截至目前我正在加载整个文本文件到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:"))
{
//
}
}
}
修改
我正在研究消费者答案,这里有一个转折假设我有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();
你很棒,过得愉快
答案 0 :(得分:5)
File.ReadLines
是你的朋友。它会给你一个IEnumerable<string>
,它懒散地从文本文件中取回行(即文件永远不会完全加载到内存中)。从那里你可以很好地使用它。
var linesOfInterest = File.ReadLines(filePath)
.SkipWhile(line => !line.Contains(searchTerm))
.Take(10);
var output = string.Join(Environment.NewLine, linesOfInterest);