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:
Abaixo um exemplo de array bidimensional:
E abaixo, um exemplo 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.



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))
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.