如何从c#中的文本文件中获取某些行?

时间:2010-12-15 15:34:12

标签: c# string file

我在C#工作,我有一个大文本文件(75MB) 我想保存与正则表达式匹配的行

我尝试使用streamreader和ReadToEnd读取文件,但需要400MB的ram

再次使用时会产生内存不足异常。

然后我尝试使用File.ReadAllLines():

string[] lines = File.ReadAllLines("file");

StringBuilder specialLines = new StringBuilder();


foreach (string line in lines)

 if (match reg exp)

  specialLines.append(line);

这一切都很棒,但是当我的功能结束时,所采取的记忆并不清楚,我就是 只有在调用该函数并执行该行时才会留下300MB的已用内存: string [] lines = File.ReadAllLines(“file”); 我看到内存清理为50MB给予或接受然后重新分配回200MB

如何清除此内存或以其他方式获取我需要的行?

4 个答案:

答案 0 :(得分:6)

        var file = File.OpenRead("myfile.txt");
        var reader = new StreamReader(file);
        while (!reader.EndOfStream)
        {
            string line = reader.ReadLine();
            //evaluate the line here.
        }
        reader.Dispose();
        file.Dispose();

答案 1 :(得分:2)

您需要流式传输文本,而不是将整个文件加载到内存中。这是一种方法,使用扩展方法和Linq:

static class ExtensionMethods
{
    public static IEnumerable<string> EnumerateLines(this TextReader reader)
    {
        string line;
        while((line = reader.ReadLine()) != null)
        {
            yield return line;
        }
    }
}

...

var regex = new Regex(..., RegexOptions.Compiled);
using (var reader = new StreamReader(fileName))
{
    var specialLines =
        reader.EnumerateLines()
              .Where(line => regex.IsMatch(line))
              .Aggregate(new StringBuilder(),
                         (sb, line) => sb.AppendLine(line));
}

答案 2 :(得分:1)

您可以使用StreamReader#ReadLine逐行读取文件并保存所需的行。

答案 3 :(得分:0)

您应该使用Enumerator模式来保持较低的内存占用,以防文件变得很大。