Exportar conteúdo de um Array para Texto utilizando AdvPL

Olá pessoal…

Hoje irei mostrar como exportar um Array e seu conteúdo para Texto, utilizando uma função customizada em AdvPL.


Recentemente estava trabalhando com importação genérica de dados via ExecAuto, e precisava ficar testando o conteúdo de vários Arrays, para testar dinamicamente criei uma rotina, que transforma array em Txt, tanto se for normal, como bidimensional, como tridimensional, etc.

Abaixo um exemplo de array normal:

Exportação de Array

Exportação de Array

Abaixo um exemplo de array bidimensional:

Exportação de Array Bidimensional

Exportação de Array Bidimensional

E abaixo, um exemplo de array tridimensional:

Exportação de Array Tridimensional

Exportação de Array Tridimensional

Fonte:

//Bibliotecas
#Include "Protheus.ch"

//Constantes
#Define STR_PULA	Chr(13)+Chr(10)

/*/{Protheus.doc} zArrToTxt
Função que exporta um array para Texto
@author Atilio
@since 21/08/2015
@version 1.0
	@param aAuxiliar, Array, Array com os dados que serão impressos
	@param lQuebr, Lógico, Define se a cada posição do array, quebra o texto
	@param cArqGera, Caracter, Arquivo a ser gerado com o conteúdo do array
	@example
	u_zArrToTxt(aArray, .T., "E:\teste_aux.txt")
	@return cTextoAux, Variável que é retornada (contendo o array em formato txt)
/*/

User Function zArrToTxt(aAuxiliar, lQuebr, cArqGera)
	Local cTextoAux	:= ""
	Local nLimite		:= 63000 //Forçando o tamanho máximo a 63.000 bytes
	Local nLinha		:= 0
	Local nColuna		:= 0
	Local nNivel		:= 0
	Default aAuxiliar	:= {}
	Default lQuebr	:= .T.
	Default cArqGera	:= ""
	
	//Se tiver linhas para serem processadas
	If Len(aAuxiliar) > 0
		//Percorrendo o Array
		For nLinha := 1 To Len(aAuxiliar)
			fImprArray(aAuxiliar[nLinha], @cTextoAux, nNivel, lQuebr, nLimite, nLinha)
		Next
		
		//Se não tiver em branco, gera o arquivo
		If !Empty(cArqGera)
			MemoWrite(cArqGera, cTextoAux)
		EndIf
	EndIf
Return cTextoAux

/*---------------------------------------------------------------------*
 | Func:  fImprArray                                                   |
 | Autor: Daniel Atilio                                                |
 | Data:  21/08/2015                                                   |
 | Desc:  Função que gera a linha do arquivo (recursivamente)          |
 *---------------------------------------------------------------------*/

Static Function fImprArray(xDadAtu, cTextoAux, nNivel, lQuebr, nLimite, nPosicao)
	Local cEspac := Space(nNivel)
	Local nColuna := 0
	
	//Finaliza o laço
	If Len(cTextoAux) >= nLimite
		Return
	EndIf
	
	//Se o tipo for numérico
	If ValType(xDadAtu) == "N"
		cTextoAux += cEspac+"["+StrZero(nPosicao, 4)+"][Type:N] "+cValToChar(xDadAtu) + Iif(lQuebr, STR_PULA, '')
	
	//Se for Data
	ElseIf ValType(xDadAtu) == "D"
		cTextoAux += cEspac+"["+StrZero(nPosicao, 4)+"][Type:D] "+dToC(xDadAtu) + Iif(lQuebr, STR_PULA, '')
		
	//Se for Array
	ElseIf ValType(xDadAtu) == "A"
		cTextoAux += cEspac+"["+StrZero(nPosicao, 4)+"][Type:A]" + Iif(lQuebr, STR_PULA, '')
		nNivel++
		//Percorrendo o Array
		For nColuna := 1 To Len(xDadAtu)
			fImprArray(xDadAtu[nColuna], @cTextoAux, nNivel, lQuebr, nLimite, nColuna)
		Next
	
	//Se for Lógico
	ElseIf ValType(xDadAtu) == "L"
		cTextoAux += cEspac+"["+StrZero(nPosicao, 4)+"][Type:L] "+cValToChar(xDadAtu) + Iif(lQuebr, STR_PULA, '')
	
	//Senão, apenas mostra o conteúdo (Memo, Char, etc)
	Else
		cTextoAux += cEspac+"["+StrZero(nPosicao, 4)+"][Type:"+ValType(xDadAtu)+"] "+Alltrim(xDadAtu) + Iif(lQuebr, STR_PULA, '')
	EndIf
Return

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Boa tarde,

    Sua lógica esta correta e funciona porem existe um comando em advpl que faz tudo isso de forma prática, que é o memowrite em conjunto com o varinfo:

    Supondo que meu array se chama aItems:

    Memowrite(“D:tempmeuArquivo.htm”,varinfo(“nome_do_array_ou_qq_outro_texto”,aItens))

    • Dan_Atilio disse:

      Boa tarde Marcos.
      Muito Obrigado pela contribuição, realmente não conhecia essa função VarInfo, acho que você só esqueceu de comentar que ela gera o texto em html, mas também pode gerar em txt, caso não queira utilizar html, o quarto parâmetro tem que ser .F.. Exemplo (utilizando o terceiro array):

      MemoWrite("E:aDados3_2.txt", VarInfo("aDados3", aDados3, , .F.))
      

      Muito interessante essa funcionalidade.
      Mais uma vez, muito obrigado.
      Um grande abraço.

Deixe uma resposta

Terminal de Informação