Mas sempre que procuro algo que não acho. Eu posto a solução quando descubro aqui.
Espero que este belíssimo fórum, que muito me ajuda, se perpetue por muito tempo.
Ao assunto, sobre CSV to DBF, eu estava procurando uma FUNÇÃO que o fizesse automaticamente e não encontrei aqui.
Verifiquei que várias das soluções postadas, não tinham características de uma verdadeira função para usarmos na conversão.
Assim criei abaixo uma função chamada CsvToDBF().
Ela cria o DBF destino com nomes de campos genericos servido para qualquer conteudo do CSV.
Ela cria automaticamente a estrutura basica do DBF destino temporario. Podendo o programador utilizar este DBF temporario do jeito que quiser.
Segue:
Código: Selecionar todos
******************************************************
func CsvToDbf(vvvCSV,vvvCabec,vvvSeparador,vvvTamMax)
******************************************************
*Converte .CSV para .DBF. com opcao de criar
*campos com mesmo nome dos cabecalhos, ou com
*nomes de campos apenas numerados.
*ONDE: vvvCSV Nome do ARQUIVO.CSV ou Outro Tipo .TXT
* vvvCabec .t. Ler 1a linha (Padrao)
* .f. Nao ler 1a Linha
* vvvSeparador Sinal Separador, padrao (;)
* vvvTamMax Tamanho maximo dos campos padrao (20)
*
*Utiliza AREA PROVISORIA 7 (Select 7).
*Retorna .t. ou .f. se conversao for sucesso ou erro.
**************************************************************
//Guardando Area corrente
vvvarea0=alltrim(str(select(dbf())))
vvvCSV=upper(vvvCSV)
if vvvTamMax=nil
vvvTamMax=20
Endif
if at(".CSV",vvvCSV)=0
vvvCSV=vvvCSV+".CSV"
endif
vvvDBF=strtran(vvvCSV,".CSV",".DBF")
if file(vvvDBF)
//Se ja existir DBF com o nome do CSV retorne erro.
return .f.
endif
If vvvSeparador=Nil
vvvSeparador=";"
Endif
if vvvCabec=nil
vvvCabec=.t.
endif
//Criando Estrutura do DBF Destino
vvvhCSV=fopen(vvvCSV)
vvvContaCampo=1
vvvLinha=freadLine(vvvhCSV)
vvvEstrut={}
vvvFinalizar=.f.
do while .t.
if at(vvvSeparador,vvvLinha)=0
vvvFinalizar=.t.
endif
vvvCampo="CAMPO"+strzero(vvvContaCampo,3)
aadd(vvvEstrut,{vvvCampo,"C",vvvTamMax,0})
vvvLinha=right(vvvlinha,len(vvvLinha)-at(vvvSeparador,vvvLinha))
vvvContaCampo++
if vvvFinalizar=.t.
exit
Endif
Enddo
dbcreate(vvvDBF,vvvEstrut)
fclose(vvvhCSV)
//Preenchendo novo DBF
Select 7
use &vvvDBF
//O Comando abaixo poderia ser utilizado finalizando
//a funcao neste ponto. Porem, encontro problemas na importacao quando
//existe algum caractere estranho dentro do CSV. Como por exemplo Alt+160.
//comando: Append From &vvvCSV DELIMITED WITH ({,vvvSeparador})
vvvhCSV=fopen(vvvCSV)
vvvContaCampo=1
vvvLinha=freadLine(vvvhCSV)
vvvFinalLinha=.f.
vvvContaLinha=1
do while .not. feof(vvvhCSV)
if at(vvvSeparador,vvvLinha)=0
vvvLinha=vvvLinha+vvvSeparador
vvvFinalLinha=.t.
endif
vvvCampo="CAMPO"+strzero(vvvContaCampo,3)
vvvConteudo = left(vvvLinha,at(vvvSeparador,vvvLinha)-1)
vvvLinha=right(vvvlinha,len(vvvLinha)-at(vvvSeparador,vvvLinha))
if lastrec() < vvvContalinha
append blank
Endif
replace &vvvCampo with vvvConteudo
vvvContaCampo++
If vvvFinalLinha=.t.
vvvLinha=freadLine(vvvhCSV)
vvvContaCampo=1
vvvFinalLinha=.f.
vvvContaLinha++
endif
Enddo
Close
fclose(vvvhCSV)
Select &vvvArea0



