Página 1 de 1

Como ler arquivo txt

Enviado: 03 Mar 2008 22:35
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

Como ler arquivo txt

Enviado: 03 Mar 2008 22:40
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????

Enviado: 04 Mar 2008 08:44
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.

Enviado: 04 Mar 2008 10:01
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,

Enviado: 04 Mar 2008 10:59
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, ';')

Enviado: 04 Mar 2008 11:14
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

Enviado: 04 Mar 2008 11:35
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.

Enviado: 04 Mar 2008 20:38
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.

Enviado: 05 Mar 2008 16:19
por Pablo César
Com certeza Rochinha.