Как получить определенные строки из текстового файла в C #? - PullRequest
3 голосов
/ 15 декабря 2010

Я работаю в C # и у меня большой текстовый файл (75 МБ). Я хочу сохранить строки, соответствующие регулярному выражению

Я попытался прочитать файл с помощью потокового ридера и ReadToEnd, но это занимает 400 МБram

и при повторном использовании создает исключение нехватки памяти.

Затем я попытался с помощью File.ReadAllLines ():

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

StringBuilder specialLines = new StringBuilder();


foreach (string line in lines)

 if (match reg exp)

  specialLines.append(line);

это все замечательно, но когдамоя функция завершает занятую память, не очищается, и у меня остается 300 МБ используемой памяти, только при вызове функции и выполнении строки: string [] lines = File.ReadAllLines ("file");Я вижу, как память очищается до 50 МБ, отдаю или беру, а затем перераспределяю обратно в 200 МБ

Как очистить эту память или получить нужные мне строки другим способом?

Ответы [ 4 ]

6 голосов
/ 15 декабря 2010
        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();
2 голосов
/ 15 декабря 2010

Вам нужно передавать текст вместо загрузки всего файла в память.Вот способ сделать это, используя метод расширения и 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));
}
1 голос
/ 15 декабря 2010

Вы можете использовать StreamReader # ReadLine для построчного чтения файла и сохранения тех строк, которые вам нужны.

0 голосов
/ 15 декабря 2010

Вы должны использовать шаблон Enumerator, чтобы сохранить небольшой объем памяти в случае, если ваш файл может быть огромным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...