Чтение следующей строки файла только один раз - PullRequest
3 голосов
/ 28 июня 2011

У меня есть приложение, которое считывает информацию из текстового файла, а затем классифицирует их и помещает в базу данных. Для одной категории мне нужно проверить строку, которая идет сразу после текущей строки, и найти определенное ключевое слово?

Как мне прочитать эту строку? Это должно произойти, когда в потоковом считывателе уже открыта текущая строка ....

Я использую c # на VS2010.

Редактировать

Весь приведенный ниже код находится в while (! SReader.EndOfStream) loop

 string line = sReader.ReadLine(); //Note: this is used way above and lots of things are done before we come to this loop

 for (int i = 0; i < filter_length; i++)
 {
       if (searchpattern_queries[i].IsMatch(line) == true)
       {
               logmessagtype = selected_queries[i];

               //*Here i need to add a if condition to check if the type is "RESTARTS" and i need to get the next line to do more classification. I need to get that line only to classify the current one. So, I'd want it to be open independently *

               hit = 1;
               if (logmessagtype == "AL-UNDEF")
               {
                   string alid = AlarmID_Search(line);
                   string query = "SELECT Severity from Alarms WHERE ALID like '" +alid +"'";
                   OleDbCommand cmdo = new OleDbCommand(query, conn);
                   OleDbDataReader reader;
                   reader = cmdo.ExecuteReader();
                   while (reader.Read())
                   {
                        if (reader.GetString(0).ToString() == null)
                        { }
                        else
                        {
                             string severity = reader.GetString(0).ToString();
                             if (severity == "1")
                                 //Keeps going on.....

Кроме того, открываемые файлы .log могут иметь размер до 50 Мб ...! Вот почему я действительно не предпочитаю читать все строки и отслеживать!

Ответы [ 5 ]

5 голосов
/ 28 июня 2011

Вот идиома для обработки текущей строки, когда у вас уже есть следующая строка:

public void ProcessFile(string filename)
{
    string line = null;
    string nextLine = null;
    using (StreamReader reader = new StreamReader(filename))
    {
        line = reader.ReadLine();
        nextLine = reader.ReadLine();
        while (line != null)
        {
            // Process line (possibly using nextLine).

            line = nextLine;
            nextLine = reader.ReadLine();
        }
    }
}

В основном это очередь с максимум двумя элементами в ней,или «однострочное чтение».

Редактировать: Упрощенно.

4 голосов
/ 28 июня 2011

Просто используйте

 string[] lines = File.ReadAllLines(filename);

и обработайте файл с циклом for (int i = 0; i < lines.Length; i ++).

Для большого файла просто кэшируйте «предыдущую строку» или выполните внеполосный ReadLine ().

1 голос
/ 28 июня 2011

Разве вы не можете просто позвонить reader.ReadLine() снова?Или проблема в том, что вам нужно использовать строку в следующей итерации цикла?

Если это достаточно маленький файл, рассматривали ли вы чтение всего файла, используя File.ReadAllLines()?Это, вероятно, сделает его более простым, хотя, очевидно, немного менее чистым в других отношениях и более требовательным к памяти для больших файлов.

РЕДАКТИРОВАТЬ: В качестве альтернативы приведен код:

using (TextReader reader = File.OpenText(filename))
{
    string line = null; // Need to read to start with

    while (true)
    {
        if (line == null)
        {
            line = reader.ReadLine();
            // Check for end of file...
            if (line == null)
            {
                break;
            }
        }
        if (line.Contains("Magic category"))
        {
            string lastLine = line;
            line = reader.ReadLine(); // Won't read again next iteration
        }
        else
        {
            // Process line as normal...
            line = null; // Need to read again next time
        }
    }
}
0 голосов
/ 28 июня 2011

Я на самом деле не эксперт по файловому IO ... но почему бы не сделать что-то вроде этого:

Перед началом чтения строк объявите две переменные.

string currentLine = string.Empty
string previousLine = string.Empty

Тогда, пока вы читаете ...

previousLine = currentLine;
currentLine = reader.ReadLine();
0 голосов
/ 28 июня 2011

Вы можете сохранить позицию потока, а затем после вызова ReadLine вернуться к этой позиции.Однако это довольно неэффективно.

Я бы сохранял результат ReadLine в «буфере» и по возможности использовал этот буфер в качестве источника.Когда он пуст, используйте ReadLine.

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