Como ler arquivo txt

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Sergio Cabral
Usuário Nível 2
Usuário Nível 2
Mensagens: 52
Registrado em: 18 Set 2004 18:51
Localização: São José dos Campos

Como ler arquivo txt

Mensagem por Sergio Cabral »

Vejam só que arquivo TXT maluco que eu tenho que ler.
Começa na primeira linha com os titulos dos campos e depois abaixo os campos separados por virgulas e com tamanhos diferentes.
E agora como ler essa coisa?

CodigoBarra;CodigoPeca;Referencia;Descricao;Fornecedor;NumeroOriginal;Unidade;PrecoTabela
2000000122960;00001;7892069013908;CARVAO DIST.BOSCH C/MOLA4,9MM;OLIMPIC;ETE7270......;PC;1,07
2000000122977;00002;7892069013953;CARVAO DIST.WAPSA C/MOLA6,3MM;OLIMPIC;DIAMETRO6,3MM;PC;1,07
2000000396330;002000400010;4891199001550;BAT.LONGA VIDA UNIVERSAL 9V.;FTG;SUPER/UNIVERS;PC;1,7
2000000391496;002000500008;4891199044236;BAT.ALCALINA P/ALARMES UNIV.;FTG;UNIVERSAL....;PC;1,38
2000000396354;002000500011;4891199027642;PILHA ALCALINA(AAA)TIP.PALITO;FTG;UNIVERSAL....;PR;2,68
2000000392615;002000600006;4891199001123;BAT.LITHIUM P/AL.POSITRON2016;FTG;UNIVERSAL....;JG;6,29
2000000666846;002000600007;4891199001130;BAT.LITHIUM P/AL.POSITRON2025;FTG;3V/2025 UNIV.;JG;6,29
2000000666853;002000600008;4891199001147;BAT.LITHIUM P/AL.POSITRON2032;FTG;3V/2032-UNIV.;JG;6,29
2000000396347;002001900002;4891199002212;BAT.HEAVY DUTY UNIVERSAL 9V.;FTG;EXTRA/UNIV.9V;PC;2,67
2000000396361;002001900003;4891199027581;PILHA ALCALINA(AA)PQ.UNIVERS.;FTG;UNIVERSAL....;PR;2,81
2000000437125;003002300003;4891199021787;PILHA AA PQ.RECAREGAV.C/4PECA;FTG;BLISTER/C4/PC;JG;12,83
2000000437088;003002300045;4891199039553;PILHA PALITO AAA RECARREGAVEL;FTG;BLISTER/C2PC.;PR;13,43
2000000436098;004002600002;7898221072301;MULTIMETRO ANALOG.VAC/DC500V.;FTG;UNIVERSAL....;PC;7,06
2000000666952;004002700007;7898221072318;MULTIMETRO DIGITAL VAC/DC500V;FTG;UNIVERSAL....;PC;24,06
2000000392608;004002700011;7899170800489;MULTIMETRO DIGITAL VAC/DC750V;FTG;UNIVERSAL....;PC;10,99
2000000442549;004002800003;7898221072967;MULTIMET.DIGIT.C/ALICAT.AMPER;FTG;C/MEDID/TEMPE;PC;28,91
2000000436043;004002900005;7898221072646;CHAVE TESTE DIGITAL 500AC/DC.;FTG;UNIVERSAL....;PC;3,12
2000000515823;004003200003;7898221076644;TIMER ANALOG.24HRS.2000W 220V;FTG;UNIVERSAL....;PC;19,09
2000000436081;004027100004;7898221076712;PONTA PROVA P/MULTIMETRO RETA;FTG;UNIVERSAL....;PC;1,41
2000000436074;004027100005;7898221075982;PONTA PROVA P/MULTIMETRO 90GR;FTG;UNIVERSAL....;PC;1,41
2000000690209;013COPO;;COPO ESPECIAL LANTERNAS G.F.;FURACAO;UNIVERSAL....;PC;0,01
2000000356341;014003400033;7898221072387;SUP.P/FERRO SOLDA C/MOLA/ESPO;FTG;UNIVERSAL....;PC;4,68
2000000350172;014003400076;7898221072356;FERRO SOLDA PT.RETA 60WX127V.;FTG;PONTA RETA...;PC;12,61
2000000350189;014003400077;7898221072363;FERRO SOLDA PT.RETA 60WX220V.;FTG;PONTA RETA...;PC;12,35
2000000350196;014003400078;7898221072332;FERRO SOLDA PT.FINA 30WX127V.;FTG;PONTA FINA...;PC;10,8
2000000350202;014003400079;7898221072349;FERRO SOLDA PT.FINA 30WX220V.;FTG;PONTA FINA...;PC;10,8
2000000392844;014003500005;7898221074381;BASTAO SILIC.BARRA P/PIST.07M;FTG;7MM/BRANCO...;BR;0,22
2000000392851;014003500007;7898221074336;BASTAO SILIC.BARRA P/PIST.11M;FTG;11MM/BRANCO..;BR;0,5
2000000666969;014003500011;7898221072059;PISTOLA P/BASTAO SILIC110/220;FTG;07MM/11-30W..;PC;3,85
2000000392837;014003500012;7898221072073;PISTOLA P/BASTAO SILIC110/220;FTG;11MM/15/50W..;PC;7,1
2000000392820;014003500013;7898221072066;PISTOLA P/BASTAO SILIC110/220;FTG;11MM 16/65W..;PC;10,21
2000000396378;014003600006;7898221071670;SOPRADOR AR QT.APLI.FILME110V;FTG;PISTOLA /110V;PC;58,99
2000000396385;014003600007;7898221071687;SOPRADOR AR QT.APLI.FILME220V;FTG;PISTOLA /220V;PC;58,99
Sou programador em Clipper 5.01 a 15 anos e procuro melhorar meus conhecimentos. Este site me parece muito bom e poderemos nos ajudar.
Sergio Cabral
Usuário Nível 2
Usuário Nível 2
Mensagens: 52
Registrado em: 18 Set 2004 18:51
Localização: São José dos Campos

Como ler arquivo txt

Mensagem por Sergio Cabral »

Continuando a pergunta acima, este é somente um pedaço do arquivo (ele é imenso).
Tentei o APPEND FROM ARQ.TXT DELIMITERS , mas não funcionou, ele pega só um pedaço do arquivo e joga nos primeiros campos do DBF.
Mas como os campos aparecem cada momento de um tamanho diferente, nem tem como criar um DBF para appendar.

E agora????
Sou programador em Clipper 5.01 a 15 anos e procuro melhorar meus conhecimentos. Este site me parece muito bom e poderemos nos ajudar.
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á

Mensagem por Pablo César »

Olha Sergio, eu acho que você terá que importar esse dados através de funções em baixo nível e converter cada campo. Para isso você vai ter que saber a estrutura do BD ou você deverá então deduzir cada tamanho com um análise prévio do conteúdo desses arquivos texto. Então terás que criar um DBF que pelo que eu posso deduzir sobre o conteúdo do texto, os campos seriam:

Código: Selecionar todos

CodigoBarra: N 13 DEC 0
CodigoPeca: C 12
Referencia: N 13 DEC 0
Descricao: C 29
Fornecedor: C 7
NumeroOriginal: C 13
Unidade: C 2
PrecoTabela: N 6 DEC 2 (isto como mínimo em valor de moeda)
Recentemente eu tive uma experiência de abstraer conteúdo de arquivos texto para importar em DBF com tamanho variados como neste caso seu. Vou tentar adaptar e te passar quando eu conseguir.
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.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Mensagem por Toledo »

Tenta o seguinte:

Código: Selecionar todos

vArq:="arquivo.txt"

PRIVATE aStru
aStru := {;
         {"CAMPO","C",100,00}}
DBCREATE("TEMP.DBF",aStru)

USE TEMP NEW
APPEND FROM (vArq) SDF
GO TOP
SKIP
DO WHILE !EOF()
 vCampo:=ALLTRIM(CAMPO)
 vCodBarra:=SUBS(vCampo,1,AT(";",vCampo)-1)
 vCampo:=SUBS(vCampo,AT(";",vCampo)+1)
 vCodPeca:=SUBS(vCampo,1,AT(";",vCampo)-1)
 vCampo:=SUBS(vCampo,AT(";",vCampo)+1)
 vRefer:=SUBS(vCampo,1,AT(";",vCampo)-1)
 vCampo:=SUBS(vCampo,AT(";",vCampo)+1)
 vDescricao:=SUBS(vCampo,1,AT(";",vCampo)-1)
 vCampo:=SUBS(vCampo,AT(";",vCampo)+1)
 vFornec:=SUBS(vCampo,1,AT(";",vCampo)-1)
 vCampo:=SUBS(vCampo,AT(";",vCampo)+1)
 vNOriginal:=SUBS(vCampo,1,AT(";",vCampo)-1)
 vCampo:=SUBS(vCampo,AT(";",vCampo)+1)
 vUnidade:=SUBS(vCampo,1,AT(";",vCampo)-1)
 vCampo:=SUBS(vCampo,AT(";",vCampo)+1)
 vPrecoTab:=SUBS(vCampo,1,AT(";",vCampo)-1)
 //Aqui vc grava as variáveis acima em seu Banco de dados.
 SKIP
ENDDO
Não testei, mas acho que vai funcionar!

Só fiquei em dúvida na seguinte linha do arquivo TXT...

2000000690209;013COPO;;COPO ESPECIAL LANTERNAS G.F.;FURACAO;UNIVERSAL....;PC;0,01

Note que tem dois ; juntos, então um dos campos do TXT está vazio. Se neste caso o exemplo acima não der certo, verifique antes se existe ; no começo de cada campo...

Código: Selecionar todos

 IF LEFT(vCampo,1)=";"
  vRefer:=""
 ELSE
  vRefer:=SUBS(vCampo,1,AT(";",vCampo)-1)
 ENDIF
 vCampo:=SUBS(vCampo,AT(";",vCampo)+1)
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Com o Fivewin, vc tem a opção de TOKEN.
Não sei se tem algo parecido em CA-Tools ou xHarbour.

Returns a token from a string

Syntax:
StrToken( <cText>, <nOcurrence> [,<cSepChar>] ) \\ <cToken>

Parameters:
<cText> The text from where we want to extract a token.
<nOcurrence> The numeric ocurrence of the token inside <cText>.
<cSepChar> The character that separates the tokens. By default it is a space (" ").

Returns:
<cToken> The token we want to retrieve.

Um exemplo:
env01->nome := strtoken(hum->linha1, 1, ';')
env01->email := strtoken(hum->linha1, 2, ';')
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinhos

Na sessão codigo fonte postei uma função que funciona como StrToken().

As vezes prefiro reinventar a roda a procurar.

Voce pode passar cada linha lida de seu arquivo e o separador e lhe sera retornado um Array com os dados.

Veja Aqui
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
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á

Mensagem por Pablo César »

Iiihhhh o que não faltou é exemplos, acho que cheguei um pouco tarde... mas eu testei e deu certinho, se quiser aproveitar Sergio aqui vai:

Código: Selecionar todos

// AppenTxt.prg

aCampos:={{"COD_BAR"  ,"N",013,000},;
          {"COD_PEC"  ,"C",012,000},;
          {"REFERE"   ,"N",013,000},;
          {"DESCRI"   ,"C",029,000},;
          {"FORNECE"  ,"C",007,000},;
          {"NUM_ORIG" ,"C",013,000},;
          {"UNIDADE"  ,"C",002,000},;
          {"PRECO_TAB","N",006,002}}
DBCREATE("CATALOGO",aCampos)
USE CATALOGO
cTextFile:="TEXTO.TXT"
nFileHandle = FOPEN( cTextFile )
IF nFileHandle < 0
   RETURN .F.
ENDIF

nFileHandle = FOPEN( cTextFile )
nFileSize = FSEEK( nFileHandle, 0, 2 )
FSEEK( nFileHandle, 0, 0 )
nBytesRead = 0
IMPORTA( nFileSize,aCampos )


FUNCTION IMPORTA(nFileSize,aCampos)
aRecord:={}
cAccumText:=""
DO WHILE .T.
   cSingle = FREADSTR( nFileHandle, 1 )
   nBytesRead = nBytesRead + 1
   IF cSingle = ";" .OR. cSingle = CHR(13)
      IF cSingle = CHR(13)
         cSingle = FREADSTR( nFileHandle, 1 )
         nBytesRead = nBytesRead + 1
         IF cSingle = CHR(10)
            cSingle = FREADSTR( nFileHandle, 1 )
            nBytesRead = nBytesRead + 1
            IF !(cSingle = CHR(26) .OR. ASC(cSingle) = 0)
               FSEEK( nFileHandle, -1, 1 )
               nBytesRead = nBytesRead - 1
            ENDIF
         ELSE
            IF !(cSingle = CHR(26) .OR. ASC(cSingle) = 0)
              FSEEK( nFileHandle, -1, 1 )
              nBytesRead = nBytesRead - 1
            ENDIF
         ENDIF
         AADD(aRecord,cAccumText)
         GRAVA(aRecord,aCampos)
         aRecord:={}
      ELSE
         AADD(aRecord,cAccumText)
      ENDIF
      cSingle = ""
      cAccumText = ""
   ELSE
      IF !(cSingle = CHR(26))
	 cAccumText = cAccumText + cSingle
      ENDIF
   ENDIF
   IF nBytesRead>nFileSize
      IF LEN(cAccumText)>1 .AND. ASCAN(v_L,cAccumText)=0
         GRAVA(aRecord,aCampos)
      ENDIF
      EXIT
   ENDIF
ENDDO
RETURN nil

Function Grava(aRecord,aCampos)
APPEND BLANK
FOR I=1 TO LEN(aRecord)
    DO CASE
       CASE aCampos[i,2]="N"
            if aCampos[i,1]="PRECO_TAB"
               FIELDPUT( i,converte(alltrim(aRecord[i]),2) )
            else
               FIELDPUT( i,VAL(alltrim(aRecord[i])) )
            endif
       CASE aCampos[i,2]="D"
            FIELDPUT( i , CTOD(aRecord[i]) )
        OTHERWISE
            FIELDPUT( I, aRecord[i] )
    ENDCASE
NEXT
RETURN NIL

Function Converte(cNumero,nDecimal) 
Return(Val(cNumero:=Stuff(cNumero,Len(cNumero)-nDecimal,0,'.')))
Só que a primeira linha do arquivo (no meu exemplo denominado "TEXTO.TXT") foi removida. Ou então seria só questão de deletar o primeiro registro no caso de não apagar a 1ª linha.
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.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho Pablo

A quantidade de opções que postamos para as respostas são na verdade as varias alternativas possiveis.

Quanto mais opções, melhor, isto enriquece e num momento de aperto nós sabemos onde procura-las e encontrar a solução.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
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á

Mensagem por Pablo César »

Com certeza Rochinha.
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