Ler arquivo TXT

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

PITERGALDIANO
Usuário Nível 2
Usuário Nível 2
Mensagens: 91
Registrado em: 28 Nov 2003 08:48

Ler arquivo TXT

Mensagem por PITERGALDIANO »

Pessoal, bom dia!

Eu faço a leitura de um arquivo TXT da seguinte forma:

1. Crio um DBF temporário
2. Dou um Append From <arquivo TXT> SDF

Feito isso eu manipulo as informações no DBF.

Porém tem um problema quando a linha desse arquivo TXT tem mais de 256 caracteres, que é o tamanho máximo do campo dentro de um DBF.

Como eu faço para fazer a leitura quando ocorrer da linha do TXT ter mais de 256 caracteres.

Agradeço a atenção de todos.

Obrigado.
Piter Galdiano
Programador Clipper
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Ler arquivo TXT

Mensagem por Maligno »

O ideal é usar as funções de manipulação de arquivos FOpen(), FRead(), etc.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Dudu_XBase
Membro Master
Membro Master
Mensagens: 1071
Registrado em: 25 Ago 2003 16:55

Re: Ler arquivo TXT

Mensagem por Dudu_XBase »

Bom Dia...
Somente para complementar a resposta do mestre Maligno...

Código: Selecionar todos


        #include "Fileio.ch" // colocar no inicio do prg..

       cLinha := space (F_BLOCK)
       cArquivo := "dudu.txt"
       nHandle  := fopen (cArquivo, FO_READ)

	while ( fread (nHandle, @cLinha, F_BLOCK) > 0 )

	    // Exemplo Gravando em Tabela conteudo de arquivo Texto
            arq_fun->(dbappend ())
	    replace arq_fun->NOME        with substr (cLinha, 7,16)  // pega da var cLinha a posicao que preciso...
	    replace arq_fun->ENDERECO with substr (cLinha, 17,46)

	enddo	
	fclose (nHandle)



________________________________________________________________________________________________________
(Aow Saudade) Clipper 5.2e, Blinker 7, RDD SIXNSX, DBFCDX /Xharbour 1.0, Rdd Mediator (Mysql) Free , RDD Sqlrdd (Sql Server) Comercial
(Hoje) C# Python Sql Server e Oracle




Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Ler arquivo TXT

Mensagem por Pablo César »

Para pegar a linha completa do arquivo é aconselhável fazer uma função que pegue linha a linha utilizando-se da busca CRLF ou seja chr(13)+chr(10). O exemplo a seguir mantém o mesmo exemplo citado pelo colega acima (para os campos: nome e endereço), mas estes de mais nada, os dados no arquivo texto deverão estar sempre na posição fixa e não variável. Caso contrário deverá ser estudado Nesse caso anexo o arquivo TXT) para saber se tem algum delimiter ou algo que dê para identificar que em tal posição começa o nome e o endereço (por exemplo). Essa verificação também terá que ser feito linha a linha, podendo estar na mesma função de desdobramento de linha.

Segue exemplo como como base:

Código: Selecionar todos

#include "fileio.ch"
#include "common.ch"

#define LINEBUFF  1024
#define CRLF      CHR(13)+CHR(10)

// Criando arquivo texto para exemplo
cTexto:="  10ANTONIO PINTO CAMARGO               19560127R. BARAO DO AMAZONAS N. 1575 VILA RU 1575 VILA RUTE 422-737432"+CRLF+;
        "1876ANTONIO BULATI                      19401010ILDEFONSO MUNHOZ DA ROCHA  N.605  PAN.605  PALMITAL 423-198fadsfdsa"+CRLF+;
        "  18AGUINALDO VELOSO DA CRUZ            19701231MANECO VIANA  DENTRO DO COLEGIO ROQUROQUE VERNALHA. 425-511dsafdssdfafd"+CRLF+;
        "  25PAULO ADRIANO MORITA                19750810ROQUE VERNALHA N.925  VILA PARANAGUA VILA PARANAGUA 422-697fffds"+CRLF+;
        "  31MARCELLY ABALEM BAKA                19790615TRAVESSA PROF.FRANCISCO GAMA E SILVAGAMA E SILVA 67 422-287dsfgds gfdgdfs"+CRLF+;
        "  33MARCO ANTONIO BERLIM                19610724MANOEL CORREIA 831                  OEL CORREIA 831 422-157gfdgf fdsggs"+CRLF+;
        "  34FRANK RODRIGUES DA SILVA            19751205AV. DR. ROQUE VERNALHA N.1195 V. CRU195 V. CRUZEIRO            gfdgdsfg  df"+CRLF+;
        "  36JOSE FERNANDO DE SOUZA              19650630CONJ. LARANJEIRA APTO.023 BL.02      APTO.023 BL.02 422-894"+CRLF+;
        "  37ANDRE MONTEIRO GARCIA               19750111R. K 27 JD. SANTOS DUMONT           . SANTOS DUMONT 423-951   gsdfgds"+CRLF+;
        "  38LUIZ CARLOS BARIDOTTI               19570207R. CORONEL ELISIO PEREIRA BL.G  APTO CJ. RIO BRANCO 423-210          f"+CRLF+;
        "  39GLAUCIA RAMOS PEREIRA RODRIGUES     19720317R. CONSELHEIRO CORREIA N.2306 JD. AL06 JD. ALVORADA 423-321          d"+CRLF+;
        "  40IONE MARI SATO                      19620703R. GASTAO SOARES GOMES N.801 PORTO DORTO DOS PADRES 422-828          fdsg"+CRLF+;
        "  53OSMAIL TADEU COSTA DE OLIVEIRA      19540523R. FLAMBOIAM 542  JD SAMAMBAIA      2  JD SAMAMBAIA 423-729"+CRLF+;
        "  57MAURICIO ANTUNES DOS SANTOS         19780120JD ALVORADA                         JD ALVORADA     422-508         gsdf"+CRLF+;
        "  58UBIRATAN CEZAR DA SILVA             19740815ESTRADA V.DOS CORREIAS NR 21 - JD EL1 - JD ELDORADO 423-560            gfgd"+CRLF+;
        "  59AMADO ANTONIO D AGOSTINI            19540902                                                    422-408               dgs"+CRLF+;
        "  61NILSON MENDES JUNIOR                19640101R. ALIPIO DOS SANTOS  1469  BOCKMAN   1469  BOCKMAN 422-603                 dsf"+CRLF+;
        "  63ADILSON FERREIRA DA SILVA           19671125R. ILDEFONSO MUNHOZ DA ROCHA NR 10922 - JD ALVORADA 422-252          fds"+CRLF+;
        "  64RICARDO FRANCELINO PINTO            19640919R. BALDUINA ANDRADE N.35 VILA HORIZO VILA HORIZONTE 425-268"+CRLF+;
        "  65CARLOS ALBERTO FALAVINE             19391007R. ANTONIO PEREIRA N.2910 VILA PARAN VILA PARANAGUA 422-202    dfsgsg"
        //+chr(26) // chr(26) representa final de arquivo
MEMOWRIT("clients.txt",cTexto)

// Criando dbf exemplo
CAMPOS:={ {"NOME"     , "C",036,000},;
          {"ENDERECO" , "C",035,000} }
DBCREATE("CLIENTS.DBF",CAMPOS)
use clients
EXTRAI("clients.txt")


FUNCTION EXTRAI(cArquivo)
local cLinha
private lEof:= .f.

nArquivo:=fopen(cArquivo,0)
if nArquivo # -1
   do while !lEof
      cLinha := LinhaArq(nArquivo,LINEBUFF)
      if len(alltrim(cLinha))>3
         clients->(dbappend ())
         replace clients->NOME     with substr (cLinha, 05,36)  // pega da var cLinha a posicao que preciso...
         replace clients->ENDERECO with substr (cLinha, 49,36)
      endif
   enddo
endif
RETURN nil

STATIC FUNCTION LinhaArq(nHandle,nBuffSize)
LOCAL cRet:= cBuff:='', nPos:= nEol:= nRead:=0
DEFAULT nBuffSize TO 1024
cBuff:=SPACE(nBuffSize)
nPos:=FSEEK(nHandle,0,FS_RELATIVE)
IF ( nRead:=FREAD(nHandle,@cBuff,nBuffSize) ) > 0
   IF ( nEol:=AT(CRLF,SUBSTR(cBuff,1,nRead)) ) == 0
      cRet:=SUBSTR(cBuff,1,LEN(cBuff)-1)
   ELSE
      cRet:=SUBSTR(cBuff,1,nEol-1)
      FSEEK(nHandle,nPos+nEol+1,FS_SET)
   END
ELSE
   lEof:=.t.
END
RETURN(cRet)
É só compilar e observar o exemplo dos arquivos clients.txt e clients.dbf que froam criados aqui para exemplificação.

OFF TOPIC: Ahhh agora que percebí... Retornou o avatar original do Maligno, essa é bem melhor... rsrs
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
PITERGALDIANO
Usuário Nível 2
Usuário Nível 2
Mensagens: 91
Registrado em: 28 Nov 2003 08:48

Re: Ler arquivo TXT

Mensagem por PITERGALDIANO »

Pessoal, bom dia!

Consegui fazer a leitura do arquivo pelo FOpen e FRead, porém quando informo a varíavel que vai armazenar os dados na função FRead, ela faz a leitura do primeiro caractar da primeira linha até o último caracter da última linha.

a pergunta é: Se eu quiser fazer a leitura somente da linha número 10? é possível?

Obrigado.
Piter Galdiano
Programador Clipper
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Re: Ler arquivo TXT

Mensagem por Pablo César »

a pergunta é: Se eu quiser fazer a leitura somente da linha número 10? é possível?
Com certeza ! Você testou e leu o exemplo que eu dei ??
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
AndersonR
Usuário Nível 1
Usuário Nível 1
Mensagens: 42
Registrado em: 11 Abr 2005 15:06

Ler arquivo TXT

Mensagem por AndersonR »

Pablo,
testei a sua função, porém ela "engole" um caracter ao final da linha, e não estou conseguindo solução.
Você tem como me dar uma dica ?
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Ler arquivo TXT

Mensagem por Pablo César »

Falta um caracter no final da linha, onde ? Na variavel clinha ? Ou no replace de endereço ? A estrutura do dbf é igual (senão for list a estrutura e de ser possivel parte do seu código.

Poderia, colocar também parte do seu texto ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder