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()  // fecha

Parser 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()
End

Gravacao 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

Veja também