Ler e gravar arquivos TXT/CSV em AdvPL
Tutorial: tecnicas pra ler e escrever arquivos texto em AdvPL. CSV, TXT, layouts fixos. Uso pratico em importacao e exportacao de dados.
Ler/escrever arquivo texto e operacao comum em AdvPL — importar planilha de fornecedor, exportar relatorio, processar layout SPED.
Leitura linha-a-linha
Local cArquivo := "C:\importacao\produtos.csv"
Local nHandle := FT_FUse(cArquivo)
Local cLinha := ""
Local nTotal := 0
If nHandle < 0
ConOut("Erro abrindo arquivo")
Return
EndIf
FT_FGoTop()
While !FT_FEof()
cLinha := FT_FReadLn()
nTotal++
ConOut("Linha " + cValToChar(nTotal) + ": " + cLinha)
FT_FSkip()
End
FT_FUse() // fechaParser CSV simples
Local aCampos := {}
Local cLinha := ""
While !FT_FEof()
cLinha := FT_FReadLn()
aCampos := StrTokArr(cLinha, ";")
If Len(aCampos) >= 3
cCod := aCampos[1]
cDesc := aCampos[2]
nPreco := Val(aCampos[3])
// ... processa
EndIf
FT_FSkip()
EndGravacao via MemoWrite
Local cConteudo := ""
Local cArquivo := "C:\export\clientes.csv"
cConteudo := "codigo;nome;cnpj" + Chr(13) + Chr(10)
DBSelectArea("SA1")
SA1->(DBGoTop())
While !SA1->(EOF())
cConteudo += SA1->A1_COD + ";"
cConteudo += AllTrim(SA1->A1_NOME) + ";"
cConteudo += SA1->A1_CGC + Chr(13) + Chr(10)
SA1->(DBSkip())
End
MemoWrite(cArquivo, cConteudo)
ConOut("Exportou em " + cArquivo)Gravacao linha-a-linha (arquivo grande)
Pra arquivos grandes (100MB+), evite concatenar em memoria — escreva direto:
Local nHandle := FCreate(cArquivo)
DBSelectArea("SA1")
While !SA1->(EOF())
cLinha := SA1->A1_COD + ";" + AllTrim(SA1->A1_NOME) + Chr(13) + Chr(10)
FWrite(nHandle, cLinha)
SA1->(DBSkip())
End
FClose(nHandle)Layout fixo (SPED, posicional)
// Cada campo tem posicao fixa, sem separador
cLinha := ""
cLinha += PadR(SA1->A1_COD, 6, ' ') // pos 1-6
cLinha += PadR(SA1->A1_NOME, 40, ' ') // pos 7-46
cLinha += StrZero(nValor*100, 12, 0) // pos 47-58, sem virgula
cLinha += DToS(Date()) // pos 59-66
FWrite(nHandle, cLinha + Chr(13) + Chr(10))Pegadinhas
- Encoding: Protheus usa cp1252 por default. Pra UTF-8 (planilha do Excel novo), considere converter antes
- Quebra de linha: Windows usa
Chr(13)+Chr(10), Linux soChr(10)— Excel aceita ambos - Aspas em CSV: campo com virgula no meio precisa estar entre aspas duplas, com aspas internas escapadas (
"") - FT_* vs FCreate/FWrite: FT_* e a familia File Text (mais facil); FCreate/FWrite e baixo-nivel mas mais flexivel
- BOM UTF-8: arquivos pra Excel as vezes precisam de BOM (
Chr(239)+Chr(187)+Chr(191)) no inicio