Função que converte um arquivo do IXBLOG transformando em um Excel para análise dos dados

Sabe aquele arquivo do IXBLOG gerado que é necessário validar? Imagina ter uma função que transforme em Excel, e deixe mais fácil a leitura.


Foi pensando nisso, que foi criado a função zLog2Excel, usando os dados de um arquivo IXBLOG. Ao gerar um arquivo de LOG notamos que existem inúmeras informações, como abaixo por exemplo.

Visualizando um IXBLOG

Porém, para deixarmos melhor a visualização e até mesmo identificar onde que há gargalos no tempo, é transformado em excel.

Log em Excel

Abaixo o fonte desenvolvido.

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zLog2Excel
Função que converte um arquivo gerado com IXBLOG em uma planilha para análise
@author Atilio
@since 29/08/2018
@version 1.0
@param cArquivo, characters, Caminho do arquivo a ser analisado
@type function
@sample u_zLog2Excel("C:\spool\administrador_461090.txt")
/*/

User Function zLog2Excel(cArquivo)
	Local aArea      := GetArea()
	Default cArquivo := ""

	//Se tiver conteúdo e o arquivo existir, chama o processamento
	If ! Empty(cArquivo) .And. File(cArquivo)
		Processa({|| fProcessa(cArquivo)}, "Processando")
	EndIf

	RestArea(aArea)
Return

/*---------------------------------------------------------------------*
 | Func:  fProcessa                                                    |
 | Desc:  Função que processa o arquivo e gera um arquivo do Excel     |
 *---------------------------------------------------------------------*/

Static Function fProcessa(cArquivo)
	Local aArea       := GetArea()
	Local oFile
	Local aLinhas     := {}
	Local nAtual      := 0
	Local cLinAtu     := ""
	Local aExport     := {}
	Local nPosSeq     := 1 //Sequencia
	Local nPosDe      := 2 //From
	Local nPosExe     := 3 //ExecBlock
	Local nPosIn      := 4 //Time In
	Local nPosOut     := 5 //Time Out
	Local nPosDif     := 6 //Diferença de Tempo
	Local oFWMsExcel
	Local oExcel
	Local cArqExport  := GetTempPath()+'zLog2Excel_'+dToS(Date())+'_'+StrTran(Time(), ':', '-')+'.xml'
	Local cWorkSheet  := "Log"
	Local cTable      := ""

	//Definindo o arquivo a ser lido
	oFile := FWFileReader():New(cArquivo)

	//Se o arquivo pode ser aberto
	If (oFile:Open())

		//Se não for fim do arquivo
		If ! (oFile:EoF())
			//Definindo o tamanho da régua
			aLinhas := oFile:GetAllLines()
			ProcRegua(Len(aLinhas))

			//Método GoTop não funciona, deve fechar e abrir novamente o arquivo
			oFile:Close()
			oFile := FWFileReader():New(cArquivo)
			oFile:Open()

			//Enquanto houver linhas a serem lidas
			While (oFile:HasLine())

				//Incrementando a régua
				nAtual++
				IncProc("Analisando linha " + cValToChar(nAtual) + " de " + cValToChar(Len(aLinhas)) + "...")

				//Buscando o texto da linha atual
				cLinAtu := oFile:GetLine()

				//Se o trecho contém IXBLOG TYPE, é uma nova linha
				If Upper("IXBLOG Type") $ Upper(cLinAtu)
					aAdd(aExport, {;
						0,;  //Sequencia
						"",; //From
						"",; //ExecBlock
						"",; //Time In
						"",; //Time Out
						"";  //Diferença de Tempo
					})

					//Define o tamanho da linha
					aExport[Len(aExport)][nPosSeq] := Len(aExport)

				//Atualiza tempo de entrada
				ElseIf Upper("Time In") $ Upper(cLinAtu)
					aExport[Len(aExport)][nPosIn] := Alltrim(SubStr(cLinAtu, At(':', cLinAtu) + 1, Len(cLinAtu)))

				//Atualiza tempo de saída
				ElseIf Upper("Time Out") $ Upper(cLinAtu)
					aExport[Len(aExport)][nPosOut] := Alltrim(SubStr(cLinAtu, At(':', cLinAtu) + 1, Len(cLinAtu)))

				//Atualiza a função chamadora
				ElseIf Upper("ExecBlock") $ Upper(cLinAtu)
					aExport[Len(aExport)][nPosExe] := Alltrim(SubStr(cLinAtu, At(':', cLinAtu) + 1, Len(cLinAtu)))

				//Atualiza a origem
				ElseIf Upper("From") $ Upper(cLinAtu)
					aExport[Len(aExport)][nPosDe] := Alltrim(SubStr(cLinAtu, At(':', cLinAtu) + 1, Len(cLinAtu)))

				EndIf
			EndDo

			//Se tiver dados a serem gerados
			If Len(aExport) > 0
				//Agora percorre os dados, e atualiza a diferença de tempo
				ProcRegua(Len(aExport))
				For nAtual := 1 To Len(aExport)
					IncProc("Atualizando totais - " + cValToChar(nAtual) + " de " + cValToChar(Len(aLinhas)) + "...")

					aExport[nAtual][nPosDif] := ElapTime(aExport[nAtual][nPosIn], aExport[nAtual][nPosOut])
				Next

				ProcRegua(0)
				IncProc("Gerando o arquivo...")

				//Cria a planilha do excel
				oFWMsExcel := FWMSExcel():New()
				oFWMsExcel:AddworkSheet(cWorkSheet)
				oFWMsExcel:AddTable(cWorkSheet, cTable)

				//Adiciona as colunas
				oFWMsExcel:AddColumn(cWorkSheet, cTable, "Sequência",           1, 1)
				oFWMsExcel:AddColumn(cWorkSheet, cTable, "Origem (From)",       1, 1)
				oFWMsExcel:AddColumn(cWorkSheet, cTable, "Função (ExecBlock)",  1, 1)
				oFWMsExcel:AddColumn(cWorkSheet, cTable, "Tempo Inicial",       1, 1)
				oFWMsExcel:AddColumn(cWorkSheet, cTable, "Tempo Final",         1, 1)
				oFWMsExcel:AddColumn(cWorkSheet, cTable, "Diferença de Tempo",  1, 1)

				//Adiciona todas as linhas no arquivo
				For nAtual := 1 To Len(aExport)
					oFWMsExcel:AddRow(cWorkSheet, cTable, aExport[nAtual])
				Next

				//Ativando o arquivo e gerando o xml
				oFWMsExcel:Activate()
				oFWMsExcel:GetXMLFile(cArqExport)

				//Abrindo o excel e abrindo o arquivo xml
				oExcel := MsExcel():New()
				oExcel:WorkBooks:Open(cArqExport)
				oExcel:SetVisible(.T.)
				oExcel:Destroy()

			EndIf
		EndIf

		//Fecha o arquivo e finaliza o processamento
		oFile:Close()
	EndIf

	RestArea(aArea)
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta