Text parser
-
I have a routine that takes identifies a specific location on each line of HEX and highlights it. It works fine until it gets to a line that the sniffer did not capture any HEX. From that point on it is highlighting random spots in the file. How should I handle identifing the error, and then continue past it without causing it to randomize the locations? Here is a sample of what I would normally see in the HEX (all one line); 2008/04/24 19:16:50 [128009]ARES_EINDICATION 010.050.082.101 103.2.01 (19d1) RX 68 bytes 19 D1 26 02 34 E8 AA 20 76 97 51 28 50 76 38 64 49 00 58 02 02 C7 88 01 C7 88 AA 50 76 38 64 49 20 76 97 51 28 D8 07 04 18 13 10 2F 00 00 10 0A 06 0A 06 06 0A 06 0A 06 06 06 06 06 06 06 06 73 74 69 9C F6 Here is a sample of the line with the error in it (all one line); 2008/04/24 19:16:51 [128009]ARES_EINDICATION 010.050.082.104 107.1.01 (1ac1) RX 68 bytes This is the snippit of the code to find the sequence numbers; private void findSequenceNumbers() { toolStripStatusLabel.Enabled = true; toolStripStatusLabel.Visible = true; //Find the ARES and ATCS L3 Sequence Numbers and change to Blue/BOLD color int lineNum = 0; bool startingNewLine = true; FontStyle style = FontStyle.Bold; string[] lines = rtbDoc.Lines; string text = rtbDoc.Text; rtbDoc.Enabled = false; for (int i = 0; i < text.Length; i++) { if (startingNewLine) { //Find and highlight ARES EINDICATION Sequence Numbers if (lines[lineNum].Contains("]ARES_EINDICATION")) { i += 154; rtbDoc.Select(i, 2); rtbDoc.SelectionFont = new Font(rtbDoc.SelectionFont, rtbDoc.SelectionFont.Style ^ style); rtbDoc.SelectionColor = Color.Blue; } //Find and highlight ARES INDICATION Sequence Number else if (lines[lineNum].Contains("]ARES_INDICATION")) { i += 154; rtbDoc.Select(i, 2); rtbDoc.SelectionFont = new Font(rtbDoc.SelectionFont, rtbDoc.SelectionFont.Style ^ style); rtbDoc.SelectionColor = Color.Blue; } //Find and highlight CODELINE INDICATION MESS
-
I have a routine that takes identifies a specific location on each line of HEX and highlights it. It works fine until it gets to a line that the sniffer did not capture any HEX. From that point on it is highlighting random spots in the file. How should I handle identifing the error, and then continue past it without causing it to randomize the locations? Here is a sample of what I would normally see in the HEX (all one line); 2008/04/24 19:16:50 [128009]ARES_EINDICATION 010.050.082.101 103.2.01 (19d1) RX 68 bytes 19 D1 26 02 34 E8 AA 20 76 97 51 28 50 76 38 64 49 00 58 02 02 C7 88 01 C7 88 AA 50 76 38 64 49 20 76 97 51 28 D8 07 04 18 13 10 2F 00 00 10 0A 06 0A 06 06 0A 06 0A 06 06 06 06 06 06 06 06 73 74 69 9C F6 Here is a sample of the line with the error in it (all one line); 2008/04/24 19:16:51 [128009]ARES_EINDICATION 010.050.082.104 107.1.01 (1ac1) RX 68 bytes This is the snippit of the code to find the sequence numbers; private void findSequenceNumbers() { toolStripStatusLabel.Enabled = true; toolStripStatusLabel.Visible = true; //Find the ARES and ATCS L3 Sequence Numbers and change to Blue/BOLD color int lineNum = 0; bool startingNewLine = true; FontStyle style = FontStyle.Bold; string[] lines = rtbDoc.Lines; string text = rtbDoc.Text; rtbDoc.Enabled = false; for (int i = 0; i < text.Length; i++) { if (startingNewLine) { //Find and highlight ARES EINDICATION Sequence Numbers if (lines[lineNum].Contains("]ARES_EINDICATION")) { i += 154; rtbDoc.Select(i, 2); rtbDoc.SelectionFont = new Font(rtbDoc.SelectionFont, rtbDoc.SelectionFont.Style ^ style); rtbDoc.SelectionColor = Color.Blue; } //Find and highlight ARES INDICATION Sequence Number else if (lines[lineNum].Contains("]ARES_INDICATION")) { i += 154; rtbDoc.Select(i, 2); rtbDoc.SelectionFont = new Font(rtbDoc.SelectionFont, rtbDoc.SelectionFont.Style ^ style); rtbDoc.SelectionColor = Color.Blue; } //Find and highlight CODELINE INDICATION MESS
That's because it looks like you're not checking to make sure that the transmission is correct. If you are counting on fixed length transmissions, make sure that you actually have the right amount of bytes. I would tackle this with regular expressions. Are you running this when receiving a message? Scott P
"Run for your life from any man who tells you that money is evil. That sentence is the leper's bell of an approaching looter." --Ayn Rand
-
That's because it looks like you're not checking to make sure that the transmission is correct. If you are counting on fixed length transmissions, make sure that you actually have the right amount of bytes. I would tackle this with regular expressions. Are you running this when receiving a message? Scott P
"Run for your life from any man who tells you that money is evil. That sentence is the leper's bell of an approaching looter." --Ayn Rand
Good suggestion. I need to learn Regex regardless. No I am not running this real time. It is a static log that is opened after the fact. First I do a string collection and create a single line of the HEX, and put the RX/TX items at a specific location to facilitate finding the correct item in the HEX to highlight and simplfy pattern searching. Once it is in a single line format, then I look for the location to highlight, then color accordingly. Here is the raw; Correct format; 2008/04/24 19:16:50 [128009]ARES_EINDICATION 010.050.082.101 103.2.01 (19d1) RX 68 bytes 2008/04/24 19:16:50 [128009] 19 D1 26 02 34 E8 AA 20 76 97 51 28 50 76 38 64 2008/04/24 19:16:50 [128009] 49 00 58 02 02 C7 88 01 C7 88 AA 50 76 38 64 49 2008/04/24 19:16:50 [128009] 20 76 97 51 28 D8 07 04 18 13 10 2F 00 00 10 0A 2008/04/24 19:16:50 [128009] 06 0A 06 06 0A 06 0A 06 06 06 06 06 06 06 06 73 2008/04/24 19:16:50 [128009] 74 69 9C F6 Incorrect/missing format; 2008/04/24 19:16:51 [128009]ARES_EINDICATION 010.050.082.104 107.1.01 (1ac1) RX 68 bytes Brian
-
Good suggestion. I need to learn Regex regardless. No I am not running this real time. It is a static log that is opened after the fact. First I do a string collection and create a single line of the HEX, and put the RX/TX items at a specific location to facilitate finding the correct item in the HEX to highlight and simplfy pattern searching. Once it is in a single line format, then I look for the location to highlight, then color accordingly. Here is the raw; Correct format; 2008/04/24 19:16:50 [128009]ARES_EINDICATION 010.050.082.101 103.2.01 (19d1) RX 68 bytes 2008/04/24 19:16:50 [128009] 19 D1 26 02 34 E8 AA 20 76 97 51 28 50 76 38 64 2008/04/24 19:16:50 [128009] 49 00 58 02 02 C7 88 01 C7 88 AA 50 76 38 64 49 2008/04/24 19:16:50 [128009] 20 76 97 51 28 D8 07 04 18 13 10 2F 00 00 10 0A 2008/04/24 19:16:50 [128009] 06 0A 06 06 0A 06 0A 06 06 06 06 06 06 06 06 73 2008/04/24 19:16:50 [128009] 74 69 9C F6 Incorrect/missing format; 2008/04/24 19:16:51 [128009]ARES_EINDICATION 010.050.082.104 107.1.01 (1ac1) RX 68 bytes Brian
So you have a file with line feeds that you make individual strings for, if I'm understanding you correctly. So all the items in the above example with the same timestamp are considered in the same transmission. Assuming the headers are never broken (not so good) you could use the RX size to count the bytes to make sure of the correct sizing. If you're considering everything between the header text (ARES_EIN---) to be one transmission, you could load a either a generic List or array String[] to hold transmissions, then colorize by line without using the index in the long string in your output window. Scott P
"Run for your life from any man who tells you that money is evil. That sentence is the leper's bell of an approaching looter." --Ayn Rand
-
So you have a file with line feeds that you make individual strings for, if I'm understanding you correctly. So all the items in the above example with the same timestamp are considered in the same transmission. Assuming the headers are never broken (not so good) you could use the RX size to count the bytes to make sure of the correct sizing. If you're considering everything between the header text (ARES_EIN---) to be one transmission, you could load a either a generic List or array String[] to hold transmissions, then colorize by line without using the index in the long string in your output window. Scott P
"Run for your life from any man who tells you that money is evil. That sentence is the leper's bell of an approaching looter." --Ayn Rand
You are correct in your understanding. Same timestamp and same stationid e.g. [129008]. The information up to the end of the [] info is the same length. From that point on the length of the message is dictated by the type of message. Thanks for the suggestions. Brian
-
You are correct in your understanding. Same timestamp and same stationid e.g. [129008]. The information up to the end of the [] info is the same length. From that point on the length of the message is dictated by the type of message. Thanks for the suggestions. Brian
Ok, you can do a very short mod to your existing code to get you in the direction. Use the
.Lines
property on the rich text box to get the lines array from it, Then do aforeach
on the lines to go through them. If I remember right the colorization is done by character index, so generating that number would be a matter of accumulating the length of the lines properly.int total = 0; foreach(String trans in rtb.Lines){ //single transmission in trans total += s.Length; ColorizationInfo temp = new ColorizationInfo(trans); Colorize(rtbDoc, temp, total); // colors a line }
Do you thing something like this would work? Of course I didn't go through the parsing like you did, but you get the main idea here. Scott P"Run for your life from any man who tells you that money is evil. That sentence is the leper's bell of an approaching looter." --Ayn Rand
-
Ok, you can do a very short mod to your existing code to get you in the direction. Use the
.Lines
property on the rich text box to get the lines array from it, Then do aforeach
on the lines to go through them. If I remember right the colorization is done by character index, so generating that number would be a matter of accumulating the length of the lines properly.int total = 0; foreach(String trans in rtb.Lines){ //single transmission in trans total += s.Length; ColorizationInfo temp = new ColorizationInfo(trans); Colorize(rtbDoc, temp, total); // colors a line }
Do you thing something like this would work? Of course I didn't go through the parsing like you did, but you get the main idea here. Scott P"Run for your life from any man who tells you that money is evil. That sentence is the leper's bell of an approaching looter." --Ayn Rand
Yes, I think this will work. I will bang it out later this afternoon, and reply with results. Thanks much. Brian
-
Ok, you can do a very short mod to your existing code to get you in the direction. Use the
.Lines
property on the rich text box to get the lines array from it, Then do aforeach
on the lines to go through them. If I remember right the colorization is done by character index, so generating that number would be a matter of accumulating the length of the lines properly.int total = 0; foreach(String trans in rtb.Lines){ //single transmission in trans total += s.Length; ColorizationInfo temp = new ColorizationInfo(trans); Colorize(rtbDoc, temp, total); // colors a line }
Do you thing something like this would work? Of course I didn't go through the parsing like you did, but you get the main idea here. Scott P"Run for your life from any man who tells you that money is evil. That sentence is the leper's bell of an approaching looter." --Ayn Rand
That worked. Thanks for the help!