I have this block of code that works perfectly and does exactly what I need it to do, but I feel like it's a dirty, awful hack of a solution and there must be a better way to get it to work. What I'm doing is reading in a SAS log file and writing the contents into a rich text box. I'm preserving the color coding that one normally sees in SAS output by checking each line as it's read to see if it meets certain conditions, then changing the text color to match the coding scheme used in SAS; because the messages written in the log can wrap beyond a single line, I'm also checking to see if the next line after a color coded line is indented to indicate that it's still a part of the previous line (which is how the output from SAS is formatted) and needs to be colored as well.
I'm also collecting the first line of any warnings or errors found in the output into an array in order to display an error/warning summary to the user once the log is done being printed to the textbox. The resulting code looks like this:
Surely there's a better solution than this mess! I've attached a SAS log file like one I'd be reading in if anyone wants to give it a try (please note there are an enormous number of errors and warnings in the log file; I did that on purpose so I'd have a diverse log file to work with). I'd appreciate any insight you guys might have.
I'm also collecting the first line of any warnings or errors found in the output into an array in order to display an error/warning summary to the user once the log is done being printed to the textbox. The resulting code looks like this:
oInFile = oInFileO.OpenTextFile(chrDrive & ":\SASH2\Log.log", IOMode.ForReading) strSText = "" Do While Not oInFile.AtEndOFStream If strSText Like "ERROR:*" Then aryErrors.Add(strSText) With frmSAS.txtLog .Selectionstart = .TextLength .SelectionColor = Color.Red .AppendText(strSText & vbNewLine) .SelectionColor = .ForeColor End With strSText = oInFile.Readline If Len(strSText) > 5 Then Do While strSText Like " *" And Not oInFile.AtEndOFStream With frmSAS.txtLog .Selectionstart = .TextLength .SelectionColor = Color.Red .AppendText(strSText & vbNewLine) .SelectionColor = .ForeColor End With strSText = oInFile.Readline Loop End If ElseIf strSText Like "NOTE:*" Then With frmSAS.txtLog .Selectionstart = .TextLength .SelectionColor = Color.Blue .AppendText(strSText & vbNewLine) .SelectionColor = .ForeColor End With strSText = oInFile.Readline If Len(strSText) > 5 Then Do While strSText Like " *" And Not oInFile.AtEndOFStream With frmSAS.txtLog .Selectionstart = .TextLength .SelectionColor = Color.Blue .AppendText(strSText & vbNewLine) .SelectionColor = .ForeColor End With strSText = oInFile.Readline Loop End If ElseIf strSText Like "WARNING:*" Then aryErrors.Add(strSText) With frmSAS.txtLog .Selectionstart = .TextLength .SelectionColor = Color.Green .AppendText(strSText & vbNewLine) .SelectionColor = .ForeColor End With strSText = oInFile.Readline If Len(strSText) > 5 Then Do While strSText Like " *" And Not oInFile.AtEndOFStream With frmSAS.txtLog .Selectionstart = .TextLength .SelectionColor = Color.Green .AppendText(strSText & vbNewLine) .SelectionColor = .ForeColor End With strSText = oInFile.Readline Loop End If Else With frmSAS.txtLog .Selectionstart = .TextLength .SelectionColor = Color.Black .AppendText(strSText & vbNewLine) .SelectionColor = .ForeColor End With strSText = oInFile.Readline End If Loop oInFile.Close()
Surely there's a better solution than this mess! I've attached a SAS log file like one I'd be reading in if anyone wants to give it a try (please note there are an enormous number of errors and warnings in the log file; I did that on purpose so I'd have a diverse log file to work with). I'd appreciate any insight you guys might have.
-
Log.txt (20.91K)
: 7