StrToken/NumToken

Dupla pra acessar partes de uma string sem montar array completo. StrToken pega a N-esima parte; NumToken conta quantas tem. Mais leve que Separa quando voce so precisa de 1 token.

Assinatura: StrToken(cString, nN, cSep) -> cToken // NumToken(cString, cSep) -> nQtd

Retorna: Character (StrToken) / Numeric (NumToken)

Quando voce so precisa de uma parte de uma string separada, StrToken e mais leve que Separa — nao monta array, vai direto pro indice. NumToken conta quantas partes tem.

Sintaxe

StrToken(cString, nN, cSep)  --> cToken
//   nN = indice (1-base) do token que voce quer

NumToken(cString, cSep)       --> nQtd

Exemplos

cStr := "01;CLIENTE A;100"

StrToken(cStr, 1, ";")    // "01"
StrToken(cStr, 2, ";")    // "CLIENTE A"
StrToken(cStr, 3, ";")    // "100"
StrToken(cStr, 4, ";")    // ""        (nao existe)

NumToken(cStr, ";")       // 3

Quando usar (em vez de Separa)

Caso pratico: CSV linha por linha sem montar array

// Arquivo CSV com 50.000 linhas, voce so quer codigo (col 1) e qtd (col 5)
While !FRead(cBuf)
    cCod  := AllTrim(StrToken(cBuf, 1, ";"))
    nQtd  := Val(StrToken(cBuf, 5, ";"))

    U_AjustaEstoque(cCod, nQtd)
EndDo
// 50.000 calls de Separa criariam 50.000 arrays
// 50.000 calls de StrToken pulam o overhead

Caso pratico: validar tamanho de CSV

// Espera 8 colunas
If NumToken(cLinha, ";") != 8
    ConOut("Linha invalida (" + cValToChar(NumToken(cLinha, ";")) + " colunas, esperadas 8)")
    Loop  // skip
EndIf

Pegadinhas

Performance: StrToken vs Separa

// Cenario: 100.000 iteracoes, pegar 1 elemento

// Lento — 100k arrays criados
For i := 1 To 100000
    aPart := Separa(cLinha, ";")
    cCod  := aPart[1]
Next

// Rapido — sem array
For i := 1 To 100000
    cCod := StrToken(cLinha, 1, ";")
Next

Veja também