2017-01-01 6 views
0

テキストファイル(実際にはIntel Hexファイルですが、データはASCIIテキスト)があり、開始行と終了行をゼロで見つける方法がありませんでしたデータ。テキストファイル内のデータ行を検索する

ファイルはデータの行で始まり、次にゼロである行をいくつか持つことができます。私がしようとしているのは、ゼロの最後のグループの場所を見つけることです。

例としてファイルには、この含まれている場合があります。このファイルの

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

を私は開始行と行の#7を返し、終了行として#9行したいと思います。

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

しかし、私はループスルーするための最良の方法で精神的なブロックを有し、かつ、開始と終了の行をセット/リセットしています:

私は現在、このようStreamReaderをし、ReadLineメソッドを使用しています。

ありがとうございました!

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

yes、right、またはフラグ 'groupEnded = true'を追加して、値がゼロでないたびにリセットします if(readData.equals ":0000000000")){ if(groupEnded){ firstZeroRow = rowNum; groupEnded = false; } lastZeroRow = rowNum; } else { groupEnded = true; } – user993533

+0

ありがとう、これは私が思考しようとしていたラインに沿って正しいです。私は毎日のプログラマー(本質的にハードウェアの男)ではないので、私はフラグをリセットするために使用するロジックに立ち往生していた。私はこれを後で試してみて、それがどのように機能するかを教えてくれます。 –

0

ので:それはここに新しいコードはだ2883.

をする必要があり、私は次の関数で働いているが、それはfirstZeroRowのための2881を返しますuser993533 @からの提案に基づき

全体的な目標が何であるかは明確ではありません...私は別のアプローチを使用しました。データの読み込み中にゼロの最後の開始行と終了行をゆがめようとするのではなく、単にすべてゼロになっている行のリストを作成しました。次に、リストを高位から低位にソートして、最後の行の行インデックスをゼロで取得します。次に、同じリストを使用して、リストの先頭から最後のゼログループの最初/開始インデックスを取得するために、隣接するインデックスが連続しているかどうかを確認するチェックが行われます。索引が連続している場合、次の要素索引が連続していないときに、最後のグループがどこで開始されたかを知るまで、単に続行します。リストの終わりに達すると、リストは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

関連する問題