Página 1 de 1

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

Enviado: 05 Jul 2016 10:27
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

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

Enviado: 05 Jul 2016 10:36
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

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

Enviado: 05 Jul 2016 10:47
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

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

Enviado: 05 Jul 2016 11:08
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

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

Enviado: 05 Jul 2016 11:39
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

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

Enviado: 05 Jul 2016 12:06
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>] )

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

Enviado: 05 Jul 2016 20:06
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

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

Enviado: 05 Jul 2016 20:22
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)