Jump to content
Fivewin Brasil

TTxtFile() Limite de colunas ?


sunset

Recommended Posts

A principio essa linha, era para retornar 30 elementos no vetor com  hb_tokens separando por ";", porem existe um limite, essa linha completa tem 1.073 colunas, sempre retorna erro quando carrego o vetor dela, porem se for deletando colunas, num certo limite o vetor alimenta. a origem um arquivo CSV.

"63688337";"0001";"53";"1";"MATERICON";"02";"20051103";"00";"";"";"19910506";"4120400";"1921700,2330301,2330302,2330303,2330304,2330305,2330399,2399199,2539001,2869100,2920401,3299003,3314717,3319800,3702900,3811400,3812200,4211101,4211102,4212000,4213800,4221901,4221902,4222701,4222702,4223500,4291000,4292801,4292802,4299599,4311801,4311802,4312600,4313400,4319300,4322301,4329104,4329199,4330401,4330402,4330404,4330405,4330499,4391600,4399101,4399102,4399103,4399104,4399105,4399199,4520005,4618402,4645101,4664800,4669999,4679699,4681801,4681802,4731800,4742300,4744001,4744002,4744003,4744004,4744005,4744099,4754701,4773300,4789005,4921302,4922101,4923002,4929902,4930201,5021101,5021102,5620101,6821802,7112000,7490199,7711000,7719501,7721700,7729203,7731400,7732201,7739001,7739002,7739003,7739099,7830200,8111700,8122200,8130300,9430800";"AVENIDA";"TORQUATO TAPAJOS";"0";"LOTE  12/A                      GLEBA 01                  PROF FRED VEIGA";"AREA DE TRANSICAO URBANA";"69039125";"AM";"0255";"92";"92997177";"";"";"";"";"CHRISTIAN_ADOLFO@HOTMAIL.COM";"";""

aDados := HB_ATokens(oFile:ReadLine(), '";"')

---------------------------------------------------------------------------------------------------

Descricao do problema:Erro BASE/1132  Erro de limite: acesso de array
   Args:
     [   1] = A   { ... } ( M->__ValToPrgExp_Array := Array(24), M->__ValToPrgExp_Array[1] := '"63688337"', M->__ValToPrgExp_Array[2] := '"0001"', M->__ValToPrgExp_Array[3] := '"53"', M->__ValToPrgExp_Array[4] := '"1"', M->__ValToPrgExp_Array[5] := '"MATERICON"', M->__ValToPrgExp_Array[6] := '"02"', M->__ValToPrgExp_Array[7] := '"20051103"', M->__ValToPrgExp_Array[8] := '"00"', M->__ValToPrgExp_Array[9] := '""', M->__ValToPrgExp_Array[10] := '""', M->__ValToPrgExp_Array[11] := '"19910506"', M->__ValToPrgExp_Array[12] := '"4120400"', M->__ValToPrgExp_Array[13] := '"1921700,2330301,2330302,2330303,2330304,2330305,2330399,2399199,2539001,2869100,2920401,3299003,3314717,3319800,3702900,3811400,3812200,4211101,4211102,4212000,4213800,4221901,4221902,4222701,4222702,4223500,4291000,4292801,4292802,4299599,4311801,4311802,4312600,4313400,4319300,4322301,4329104,4329199,4330401,4330402,4330404,4330405,4330499,4391600,4399101,4399102,4399103,4399104,4399105,4399199,4520005,4618402,4645101,4664800,4669999,4679699,4681801,4681802,4731800,4742300,4744001,4744002,4744003,4744004,4744005,4744099,4754701,4773300,4789005,4921302,4922101,4923002,4929902,4930201,5021101,5021102,5620101,6821802,7112000,7490199,7711000,7719501,7721700,7729203,7731400,7732201,7739001,7739002,7739003,7739099,7830200,8111700,8122200,8130300,9430800"', M->__ValToPrgExp_Array[14] := '"AVENIDA"', M->__ValToPrgExp_Array[15] := '"TORQUATO TAPAJOS"', M->__ValToPrgExp_Array[16] := '"0"', M->__ValToPrgExp_Array[17] := '"LOTE  12/A                      GLEBA 01                  PROF FRED VEIGA"', M->__ValToPrgExp_Array[18] := '"AREA DE TRANSICAO URBANA"', M->__ValToPrgExp_Array[19] := '"69039125"', M->__ValToPrgExp_Array[20] := '"AM"', M->__ValToPrgExp_Array[21] := '"0255"', M->__ValToPrgExp_Array[22] := '"92"', M->__ValToPrgExp_Array[23] := '"92997177"', M->__ValToPrgExp_Array[24] := "", M->__ValToPrgExp_Array )
     [   2] = N   25
 

 

Link to comment
Share on other sites

Vc consegue gerar um fonte autonomo, que somente compilando ele e executando simula o problema?

faça no seu fonte uma funcao que gera em runtime o arquivo texto e dps vc lê o arquivo e executa o HB_ATOKENS

se vc fizer isso eu posso tentar te ajudar

Link to comment
Share on other sites

Olá

Troque a HB_Atokens por aToken()

atoken(oFile:ReadLine(), ';' )

Veja se resolve.

Um abraço

 

//////////////////////////////////////
Function atoken(cStr, cStr1, lVazio )
//////////////////////////////////////

LOCAL nNum, nNum1, aArr := {}
LOCAL aArr1 := {}
LOCAL nNum2, nNum3

Default lVazio := .f.

if cstr1 = NIL
  cStr1 := " "
endif

nNum2 := len(cStr1)
for nNum1 := 1 to nNum2
   aadd(aArr1, substr(cStr1, nNum1, 1))
next

do while .T.
   nNum := 0
   for nNum3 := 1 to nNum2
       nNum1 := AT(aArr1[nNum3], cStr)
       nNum := MIN(IF(nNum == 0, LEN(cStr) + 1, nNum), IF(nNum1 == 0, ;
           nNum, nNum1))

   next

   if nNum = 0
      exit
   endif

   if nNum > 1
      aadd( aArr, left( cStr, nNum - 1))
   elseif nNum = 1 .and. lVazio
      aadd( aArr, '' )
    endif

   cStr := substr(cStr, nNum + 1)

enddo

if len(cStr) > 0
   aadd( aArr, cStr)
endif

return aArr

Link to comment
Share on other sites

Boa noite.

Usando o atoken, tenho um problema porque no meio dos dados existem endereços que tem ; então ele faz a quebra, se usar (";"), o atokens já apresenta erro no inicio da leitura.

Segue aqui um exemplo do ; no meio do texto fazendo a quebra.

"33605671";"0001";"35";"1";"CASEIROS POR AMOR";"02";"20190513";"00";"";"";"20190513";"5620104";"4721104,5612100";"RUA";"CARDEAL";"S/N";"QUADRA 016;LOTE 0036;CASA 01";"SETOR COMENDADOR WALMOR";"74969283";"GO";"9227";"62";"84361276";"";"";"";"";"dilyannelopes12@gmail.com";"";""

"33605671";

"0001";

"35";

"1";

"CASEIROS POR AMOR";

"02";

"20190513";

"00";

"";

"";

"20190513";

"5620104";

"4721104,5612100";

"RUA";"CARDEAL";

"S/N";

"QUADRA 016;LOTE 0036;CASA 01"; ******************* aqui 

"SETOR COMENDADOR WALMOR";

"74969283";

"GO";

"9227";

"62";

"84361276";

"";

"";

"";

"";

"dilyannelopes12@gmail.com";

"";

""

 

Link to comment
Share on other sites

Com HB_ATokens(oFile:ReadLine(), '";"') , eu consigo passar os 3 " ; " , dentro de ' ";"  ' ,  consigo ler a quebra corretamente assim, meu problema esta na quantidade de colunas.

Estou fazendo na mão mesmo, quando há a quebra por causa da quantidade de colunas eu edito o arquivo TXT manualmente retiro o excedente, leio novamente e adiciono a informação na mão direto no banco. E VIDA QUE SEGUE.

Link to comment
Share on other sites

  • 2 weeks later...

Amiguinhos, 

Vou deixar aqui uma função simples dos tempos do Clipper Summer que uso para ler sequencialmente arquivos como .CSV e resgatar seus valores colocando-os em vetores.

	FUNCTION StringToArray( cString, cSeparator ) 
   LOCAL nPos 
   LOCAL aString := {} 
   DEFAULT cSeparator := ";" 
   cString := ALLTRIM( cString ) + cSeparator 
   DO WHILE .T. 
      nPos := AT( cSeparator, cString ) 
      IF nPos = 0 
         EXIT 
      ENDIF 
      AADD( aString, SUBSTR( cString, 1, nPos-1 ) ) 
      cString := SUBSTR( cString, nPos+1 ) 
   ENDDO 
   RETURN ( aString ) 
	

Usando uma função memolie() trazendo cada linha de um arquivo e passando como primeiro parametro da função, basta informar qual o caracter separador.



...

cMinhaString := memoline( ...

...

do while ...
      ...
      ArrayDaLinha := stringTOarray( cMinhaString, ";" )

Link to comment
Share on other sites

  • 2 weeks later...
Em 14/06/2021 at 19:54, macs disse:

Chegou a tentar com a função: numAt()

nTokens := numAt( ";", oFile:ReadLine() )

Sim, usei mas de outra forma, coloquei para contar quantos ; teria na linha, então quando contagem esta diferente de 30 eu ignoro a linha, ja resolve meu problema, de não abortar o processo com erro, porem o problema original e de fato a horizontal de caracteres que o fw teria limite com certeza.

Link to comment
Share on other sites

Em 17/06/2021 at 04:21, rochinha disse:

Amiguinhos, 

Vou deixar aqui uma função simples dos tempos do Clipper Summer que uso para ler sequencialmente arquivos como .CSV e resgatar seus valores colocando-os em vetores.

 


	FUNCTION StringToArray( cString, cSeparator ) 
   LOCAL nPos 
   LOCAL aString := {} 
   DEFAULT cSeparator := ";" 
   cString := ALLTRIM( cString ) + cSeparator 
   DO WHILE .T. 
      nPos := AT( cSeparator, cString ) 
      IF nPos = 0 
         EXIT 
      ENDIF 
      AADD( aString, SUBSTR( cString, 1, nPos-1 ) ) 
      cString := SUBSTR( cString, nPos+1 ) 
   ENDDO 
   RETURN ( aString ) 
	

 

Usando uma função memolie() trazendo cada linha de um arquivo e passando como primeiro parâmetro da função, basta informar qual o caractere separador.

 



 

...

cMinhaString := memoline( ...

...

do while ...
      ...
      ArrayDaLinha := stringTOarray( cMinhaString, ";" )

A função incorre no mesmo erro o separador e a quantidade de caracteres em uma unica linha, mas consegui contornar, contando os separadores da linha, alguns dados não são capturados, então estou "guardando" esses dados para fazer uma edição manual no CSV pra reduzir as informações e o arquivo conseguir ser lido.

 

 

Grato a todos.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...