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...
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():
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)