Separa
Split de string em array por separador. Equivalente do .split() de outras linguagens. Util pra parser CSV simples, parse de codigo composto.
Assinatura: Separa(cString, cSep, [lTratar]) -> aPartes
Retorna: Array of Character
Separa e o "split" do AdvPL. Recebe string + separador, devolve array com as partes. Indispensavel pra processar CSVs simples, codigos compostos (FILIAL/COD/LOJA), URLs.
Sintaxe
Separa(cString, cSep, lTratar) --> aPartes
// cString - string a dividir
// cSep - delimitador (1 char tipico, mas aceita strings)
// lTratar - .T. = remove espacos extras de cada parte (opcional, default .F.)
Exemplos basicos
aPart := Separa("a,b,c", ",")
// aPart = {"a", "b", "c"}
aPart := Separa("filial/cliente/loja", "/")
// aPart = {"filial", "cliente", "loja"}
aPart := Separa("nome , sobrenome ", ",", .T.)
// aPart = {"nome", "sobrenome"} (com lTratar=.T. faz AllTrim em cada)
aPart := Separa("semSeparador", ",")
// aPart = {"semSeparador"} (1 elemento — string inteira)
Casos praticos
1. Parser de CSV simples (sem aspas)
User Function ImpCSV(cArq)
Local cConteudo := MemoRead(cArq)
Local aLinhas := Separa(cConteudo, Chr(10))
Local aCampos
Local i
For i := 1 To Len(aLinhas)
If !Empty(aLinhas[i])
aCampos := Separa(aLinhas[i], ";", .T.)
// aCampos[1]=codigo, [2]=nome, [3]=qtd
U_IncluiProd(aCampos[1], aCampos[2], Val(aCampos[3]))
EndIf
Next
Return
2. Parser de email
cEmail := "joao.silva@empresa.com.br"
aPartes := Separa(cEmail, "@")
cUser := aPartes[1] // "joao.silva"
cDom := aPartes[2] // "empresa.com.br"
// Subdominios
aSub := Separa(cDom, ".")
// aSub = {"empresa", "com", "br"}
3. Path absoluto pra partes
cPath := "/var/protheus/system/sigamat.emp"
aPartes := Separa(cPath, "/")
// aPartes = {"", "var", "protheus", "system", "sigamat.emp"}
// note o "" inicial — path absoluto comeca com /
4. Lista de emails copiar (CC)
cDestinatarios := "joao@a.com;maria@b.com;pedro@c.com"
aEmails := Separa(cDestinatarios, ";", .T.)
For i := 1 To Len(aEmails)
SendMail(..., aEmails[i], ...)
Next
Quando NAO usar
- CSV com aspas/escape — Separa nao trata
"a, b", ccorretamente (vai dividir entre b" e c). Use parser dedicado. - JSON/XML — use
JsonObjectou parser real. - Strings muito grandes (centenas de MB) — pode estourar memoria. Use leitura linha-a-linha com FRead.
Pegadinhas
- String vazia retorna array com 1 elemento vazio:
Separa("", ",")={""}. - Separador no inicio/fim gera partes vazias:
Separa(",a,b,", ",")={"","a","b",""}. - Separador composto (mais de 1 char) funciona, mas raro:
Separa("a||b||c", "||")={"a","b","c"}. - Combinacao com AllTrim e mais segura que
lTratar=.T.— controla case por case. - Nao confunda com String split de outras linguagens que aceitam regex — Separa e match literal.
Parâmetros
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cString | Character | sim | String a dividir. |
cSep | Character | sim | Separador (1 ou mais chars). |
lTratar | Logical | não | .T. aplica AllTrim em cada parte. |