Pesquisar em um stringcom o at() a partir de uma posicao

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Pesquisar em um stringcom o at() a partir de uma posicao

Mensagem por rubens »

Bom dia...

Tem esse argumento na função AT()?
Pesquisar a partir de uma posição?

Por exemplo tenho uma string
cString := "Nome:Rubens Nome:José Nome:Maria Nome:Joaquim"
Eu preciso ler todos os nomes, então leio o primeiro "Nome:" e vou pesquisar novamente com o AT() a partir daquela posição até ler todos os nomes.
Na documentação do Clipper/Harbour que tenho só tem a informação de AT( cSearch, cString).
Na xDEV quando mostra a ajuda do comando ele dá opções de AT( cSearch, cString, nSart, nEnd ). Provavelmente o Vailton achou isso em alguma documentação, mas testei e não compila.

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Pesquisar em um stringcom o at() a partir de uma posicao

Mensagem por Toledo »

Veja:
At()
Locates the position of a substring within a character string.
Syntax
At( <cSearch>, <cString>, [<nStart>], [<nEnd>] ) --> nPos

Arguments
<cSearch> is the substring to search for.
<cString> is the searched character string.
<nStart> A numeric expression indication the position of the first character in <cString> to begin the search with. It defaults to 1.
<nEnd> A numeric expression indicating the position of the last character in <cString> to include in the search. It defaults to Len(<cString>). If <nEnd> is a negative value, the position for the last character is counted from the end of <cString>.

Return
The function returns a numeric value which is the position in <cString> where <cSubString> is found. The return value is zero when <cSubString> is not found.

Description
The function At() searches the string <cString> from left to right for the character string <cSearch>. The search begins at position <nStart> and is case-sensitive. If <cString> does not contain <cSearch>, the function returns 0.
Note: use function RAt() to search <cString> from right to left.

Example
// The example demonstrates various results of At().

PROCEDURE Main()
LOCAL cString := "xHarbour"

? At( "Ha", cString ) // result: 2

? At( "ARB" , cString ) // result: 0

? At( "ARB" , Upper(cString) ) // result: 3

? At( "r" , cString ) // result: 4

? At( "r" , cString, 5 ) // result: 8

? At( "r" , cString, 5, 7 ) // result: 0
RETURN
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
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Pesquisar em um stringcom o at() a partir de uma posicao

Mensagem por rubens »

Toledo...

Com AT() dá erro se colocar mais de 2 argumentos...
ErroAT.png
Daí lembrei que no harbour normalmente tem a função equivalente colocando hb_ na frente do nome da função, daí coloquei HB_AT() e funcionou belezinha... com esta relação que você passou que é a mesma que eu tinha visto.

Resolvido.

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Pesquisar em um stringcom o at() a partir de uma posicao

Mensagem por Toledo »

Um exemplo do que você pode fazer:

Código: Selecionar todos

PROCEDURE Main()
cString := "Nome:Rubens Nome:José Nome:Maria Nome:Joaquim"
cString := Subs(cString,6)+"Nome:"
Do While !Empt(cString)
  ? Subs(cString,1,AT("Nome:",cString)-1)
  cString:=Subs(cString,AT("Nome:",cString)+5)
EndDo
Return
ou

Código: Selecionar todos

PROCEDURE Main()
cString := "Nome:Rubens Nome:José Nome:Maria Nome:Joaquim"
aTokens := HB_ATokens( cString, "Nome:" )
FOR i := 1 TO Len( aTokens )
  if !Empt(aTokens[i])
    ? aTokens[i]
  endif
NEXT
Return
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
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Pesquisar em um stringcom o at() a partir de uma posicao

Mensagem por rubens »

Beleza... Toledo...

Eu fazia algo bem parecido com o que voce colocou n o primeiro exemplo...

Essa Atokens aí é bem interessante !!!

Eu tô/tava precisando disso para usar na rotina de importação de xml, para contar os produtos. Mas eu não quero ficar redimensionando a string.
Daí o Toya me deu a idéia de contar de 1 até 1000 que é a qtde máxima de itens em uma nfe. O algoritimo ficou melhor do que ficar redimensionando, mas aí apareceu o problema de que a tag <det item="N"> é o início de cada produto mas o final é <det> daí um <det> qualquer poderia ser o final de qualquer produto. Teria que redimensionar a String de novo. Vi o argumento de "a partir de" no AT(), pareceu ser a melhor saída.
Mas com essa opção do aTokens aí me parece que fica melhor ainda. Vamos pros testes...

Obrigado

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Pesquisar em um stringcom o at() a partir de uma posicao

Mensagem por Jairo Maia »

Olá Pessoal,
rubens escreveu:Com AT() dá erro se colocar mais de 2 argumentos...
Em Harbour, para usar mais de 2 argumentos é a função Hb_At():

Código: Selecionar todos

Hb_At( <cSearch>, <cString>, [<nStart>], [<nEnd>] )
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Pesquisar em um stringcom o at() a partir de uma posicao

Mensagem por asimoes »

Eu uso essa função:

Código: Selecionar todos

cBusca:="de"
cString:="Rio de Janeiro"

FOR I:=1 TO Len(cString)
   IF (I > 3) .and. (hwg_NUMAT( cBusca, cString) > 0)

   ENDIF
NEXT



IF  hwg_NUMAT( cBusca, cString) > 0
   Alert("Achou")
ENDIF

FUNCTION hwg_NUMAT( ... )
LOCAL nCount := 0, I, cSearch, cString
   cSearch := hb_PValue(1)
   cString := hb_PValue(2)
   FOR I:=1 TO Len(cString)
       IF SubStr(cString, I, Len(cSearch)) == cSearch
          nCount ++
       ENDIF
   NEXT
RETURN nCount
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Pesquisar em um stringcom o at() a partir de uma posicao

Mensagem por JoséQuintas »

Só pra complementar:

At() compatível com Clipper
hb_At() igual At() mas aceita parâmetros adicionais

At() com mais parâmetros é do xHarbour, talvez na xhb.lib de compatibilidade.
Não recomendo mexer com isso, porque pode acrescentar outras compatibilidades não desejadas. (se é que existe lá At() com mais parâmetros)
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder