2017-01-01 2 views
0

У меня есть текстовый файл (это действительно файл Intel Hex, но данные ASCII-текст), и я не смог найти способ найти начальную и конечную строки нуля данные.Найти строки данных в текстовом файле

Файл начинается с строк данных, а затем может иметь несколько строк, которые равны нулю, а затем данные снова. Я пытаюсь найти местоположение последней группы нулей.

В качестве примера файл может содержать следующее:

:1234567890 
:0987654321 
:0000000000 
:0000000000 
:ABCDEFABCD 
:DCBAFEDCBA 
:0000000000 
:0000000000 
:0000000000 
:9999999999 

Для этого файла я хочу вернуть строку # 7 в качестве исходного ряда и ряд # 9 в финале ряда.

настоящее время я использую StreamReader и ReadLine так:

StreamReader srHexFile = File.OpenText(m_pathHexFile); 
while ((readData = srHexFile.ReadLine()) != null) 
.... 

Но у меня ментальный блок на лучшем способе проходных и установить/сбросить начальные и конечные строки.

Заранее благодарим за любую помощь!

на основе предложения от @ user993533 я работаю со следующей функцией, но он возвращался 2881 для firstZeroRow, где он должен быть 2883.

Вот новый код:

private int FindEndofFlashData() 
    { 
     int lineNumber = 0; 
     String readData; 
     String zeroRowData = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; 
     int firstZeroRow = -1; // Will hold the location that starts the zero data 
     //int lastZeroRow = m_numberOfFlashRows - 2; // We know where to stop looking from m_numberOfFlashRows 
     int lastZeroRow = -1; 
     bool groupEnded = true; 
     StreamReader srHexFile = File.OpenText(m_pathHexFile); 

     /* Loop till the main flash row data ends, which will be used to calculate the number of lines in hex file for 
     * flash rows. Each line of hex file will have data for 1/2 th of a Flash row (64 bytes)*/ 
     while (((readData = srHexFile.ReadLine()) != null) && (lineNumber < (m_numberOfFlashRows*4 - 4))) 
     { 

      if ((readData[HEX_FILE_RECORD_TYPE_CHAR_0_INDEX] == HEX_FILE_DATA_RECORD_CHAR_0) && (readData[HEX_FILE_RECORD_TYPE_CHAR_1_INDEX] == HEX_FILE_DATA_RECORD_CHAR_1)) 
      { 
       lineNumber++; 

       if (readData.Substring(9, 128) == zeroRowData) 
       { 
        if(groupEnded) 
        { 
         firstZeroRow = lineNumber; 
         groupEnded = false; 
        } 

        lastZeroRow = lineNumber; 
       } 
       else 
       { 
        groupEnded = true; 
       } 
      } 
      else 
      { 

       if ((readData[HEX_FILE_RECORD_TYPE_CHAR_0_INDEX] == HEX_FILE_EXTEND_LINEAR_RECORD_CHAR_0) && 
        (readData[HEX_FILE_RECORD_TYPE_CHAR_1_INDEX] == HEX_FILE_EXTEND_LINEAR_RECORD_CHAR_1)) 
       { 
        if (readData[HEX_FILE_EXTENDED_ADDR_CHAR_1_INDEX] >= HEX_FILE_EXTENDED_ADDR_NON_FLASH_REGION) 
        { 
         break; 
        } 
       } 
      } 

     } 
     Console.WriteLine("First Zero Row is: {0}", firstZeroRow); 
     Console.WriteLine("Last Zero Row is: {0}", lastZeroRow); 
     return (firstZeroRow); 
    } 
+0

ну, петли у вас уже есть, что у вас проблемы со следующим? –

ответ

0
long firstZeroRow = -1; 
    long lastZeroRow = -1; 
    long rowNum = 0; 

    StreamReader srHexFile = File.OpenText(m_pathHexFile); 
    while ((readData = srHexFile.ReadLine()) != null){ 
     rowNum++; 
     if (readData.equals(":0000000000" /*or ":0000000000\n"*/)){ 
      if (firstZeroRow == -1){ 
       firstZeroRow = rowNum; 
      } 
      lastZeroRow = rowNum; 
     } 
    } 

    if (firstZeroRow == -1){ 
     System.out.println("firstZeroRow: " + firstZeroRow); 
     System.out.println("lastZeroRow: " + lastZeroRow); 
    } 
+0

кажется очень близким, но нужна первая строка последней группы (# 7). 'rowNum' можно сравнить с' lastZeroRow', чтобы проверить, была ли предыдущая строка нулевой – Slai

+0

да, справа или добавить флаг 'groupEnded = true' и сбросить его каждый раз, когда значение не равно if (readData.equals (": 0000000000")) { if (groupEnded) { firstZeroRow = rowNum; groupEnded = false; } lastZeroRow = rowNum; } else { groupEnded = true; } – user993533

+0

спасибо, это правильно по линиям, которые я пытался продумать. Я не ежедневный программист (парень по природе), поэтому я зациклился на логике, чтобы использовать для сброса флага. Я попробую позже и дам вам знать, как это работает. –

0

С неясно, какова общая цель ... Я использовал другой подход. Вместо того, чтобы пытаться манипулировать последними начальными и конечными строками нулей во время чтения в данных, я просто составил список тех строк, которые являются нулями. Затем просто отсортируйте список с высокого на низкий, чтобы получить индекс строки последней строки с нулями. Затем, используя тот же список, чтобы получить первый/начальный индекс последней группы нулей (ов), начиная с верхней части списка, выполняется проверка, смежны ли соседние индексы. Если индексы смежны, то мы просто продолжаем идти до тех пор, пока следующий индекс элемента не будет смежным, в какой точке мы будем знать, где была запущена последняя группа. Если мы дойдем до конца списка, вы узнаете, что список начался с строки нулей, в этом случае индекс будет равен 0. Я знаю, что мои индексы отключены на 1 из вашей записи, потому что я начал с ноль (0), а не 1.

private static void GetStartEndOfLastGroupOfZeros() { 
    string readData = ""; 
    int rowNum = 0; 
    List<int> rowsOfZero = new List<int>(); 
    StreamReader srHexFile = File.OpenText(m_pathHexFile); 
    while ((readData = srHexFile.ReadLine()) != null) { 
    if (readData.Equals(":0000000000")) { 
     rowsOfZero.Add(rowNum); 
    } 
    rowNum++; 
    } 
    rowsOfZero.Reverse(); 
    PrintIndexes(rowsOfZero); 
    if (rowsOfZero.Count < 1) { 
    Console.WriteLine("There are NO rows that are :0000000000"); 
    } 
    else { 
    Console.WriteLine("\n\rStart line number of Last Zero Group: " + GetFirstIndexOfLastGroupOfZeroRows(rowsOfZero)); 
    Console.WriteLine("End line number of Last Zero Group: " + GetLastIndexOfLastGroupOfZeroRows(rowsOfZero)); 
    } 
} 

private static int GetFirstIndexOfLastGroupOfZeroRows(List<int> rowsOfZero) { 
    if (rowsOfZero.Count < 1) // <- if there are not any int in the list then there are no zero rows return -1; 
    return -1; 
    if (rowsOfZero.Count < 2) // <- if there is only one row then it starts and ends on that single row 
     return rowsOfZero[0]; 
    if (rowsOfZero[1] + 1 != rowsOfZero[0]) // <-- if the second element(1) is not contiguous, then the last row is a single zero row, 
    return rowsOfZero[0];     // <-- so the start line of the last group will be the same as the end line index 
    int startOfThisGroup = 0; 
    for (int i = 2; i < rowsOfZero.Count; i++) { 
    if (rowsOfZero[i] + 1 == rowsOfZero[i - 1]) { // <-- if they are contiguous then we have a new startOfThisGroup row, if not we are done checking 
     startOfThisGroup = rowsOfZero[i]; 
    } 
    else { 
     break; 
    } 
    } 
    return startOfThisGroup; 
} 

private static int GetLastIndexOfLastGroupOfZeroRows(List<int> rowsOfZero) { 
    if (rowsOfZero.Count < 1) 
    return 0; 
    return rowsOfZero[0]; 
} 

private static void PrintIndexes(List<int> rowsOfZero) { 
    if (rowsOfZero.Count < 1) { 
    Console.WriteLine("No zero rows"); 
    } 
    else { 
    Console.Write("Sorted (high to low) row indexes that are ':0000000000' -> "); 
    foreach (int curInt in rowsOfZero) 
     Console.Write(curInt + " "); 
    } 
    Console.WriteLine(""); 
} 

Надеюсь, что это поможет.

+0

Интересный подход, спасибо, что нашли время подумать об этом. Чтобы ответить на ваш вопрос о конечной цели, я работаю над проектом, где я буду программировать некоторые процессоры. Когда компиляция прошивки (PSoC), полученный в результате файл Intel Hex имеет данные для всей области флэш-памяти и использует нулевое заполнение в конце кода до конца вспышки. В конце файла есть некоторые метаданные, которые могут меняться, поэтому мне нужно найти этот диапазон. Я немного разбиваю программирование процессоров, чтобы сэкономить время, которое я хотел остановить в конце фактических данных. –

+0

@George Ioakimedes. Благодарим вас за то, что вы позволили нам понять, какова ваша цель. FYI Я тщательно протестировал этот код, и он работает правильно. В зависимости от количества данных и количества нулевых строк, я думал, что это будет более простой подход. Надеюсь, вы получите его работу с вашим подходом. – JohnG

Смежные вопросы