sunset Posted May 24, 2021 Report Share Posted May 24, 2021 Boa noite Alguém sabe o limite de colunas para leitura com Ttxtfile() ? oFile := TTxtFile():New(cNome_ArquivoTXT) Grato. Quote Link to comment Share on other sites More sharing options...
emotta Posted May 25, 2021 Report Share Posted May 25, 2021 Tem limite ? Quote Link to comment Share on other sites More sharing options...
sunset Posted May 25, 2021 Author Report Share Posted May 25, 2021 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 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 25, 2021 Report Share Posted May 25, 2021 Tente: aDados := HB_Atokens( Alltrim( Memoline( cTexto, 255, f ) ), ",") Abs. Quote Link to comment Share on other sites More sharing options...
sunset Posted May 25, 2021 Author Report Share Posted May 25, 2021 Com 1.057 ja funciona, problema e editar o arquivo com 480 mil linhas. Quote Link to comment Share on other sites More sharing options...
sunset Posted May 25, 2021 Author Report Share Posted May 25, 2021 12 minutos atrás, kapiaba disse: Tente: aDados := HB_Atokens( Alltrim( Memoline( cTexto, 255, f ) ), ",") Abs. Memoline estoura a memoria, a o divisor dos vetores seria o ; as , fazem a divisão dos dados dentro de um vetor. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 25, 2021 Report Share Posted May 25, 2021 Assim, o que acontece? cText := MemoRead( "TEXTO.TXT" ) aDados := HB_ATokens( cText, CRLF ) Abs. Quote Link to comment Share on other sites More sharing options...
emotta Posted May 25, 2021 Report Share Posted May 25, 2021 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 Quote Link to comment Share on other sites More sharing options...
alex2002 Posted May 25, 2021 Report Share Posted May 25, 2021 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 Quote Link to comment Share on other sites More sharing options...
sunset Posted May 29, 2021 Author Report Share Posted May 29, 2021 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"; ""; "" Quote Link to comment Share on other sites More sharing options...
alex2002 Posted June 1, 2021 Report Share Posted June 1, 2021 Amigo, então é complicado porque o delimitador é o ":", creio que nenhum separador vai conseguir fazer este trabalho. Mas neste caso, vc pode alterar a função e separar apenas o que estiver dentro das aspas dupla. Quote Link to comment Share on other sites More sharing options...
sunset Posted June 1, 2021 Author Report Share Posted June 1, 2021 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. Quote Link to comment Share on other sites More sharing options...
macs Posted June 14, 2021 Report Share Posted June 14, 2021 Chegou a tentar com a função: numAt() nTokens := numAt( ";", oFile:ReadLine() ) Quote Link to comment Share on other sites More sharing options...
rochinha Posted June 17, 2021 Report Share Posted June 17, 2021 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, ";" ) Quote Link to comment Share on other sites More sharing options...
sunset Posted June 29, 2021 Author Report Share Posted June 29, 2021 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. Quote Link to comment Share on other sites More sharing options...
sunset Posted June 29, 2021 Author Report Share Posted June 29, 2021 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. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.