Função apare, retira espaços ao redor de strings.

Iniciado por adalberto, Setembro 12, 2016, 09:30:27 PM

tópico anterior - próximo tópico

adalberto

O que queremos é uma função que retire espaços ao redor de uma string.

Neste caso devemos processar a string usando funções já prontas em Prisma da biblioteca string.

Usaremos a função string.corte  para percorrer cada caractere e ao chegar em um caractere que não seja espaço marcar a posição com uma variável, do inicio para o final e depois do final para o inicio. Utilizaremos as variáveis ini (inicio) e final para marcar o início e fim da string excluindo os espaços ao redor se houver.

Depois basta cortar a string nestas posições marcadas pelas variáveis.

Veja o código:

//apare string (trim) string em prisma

str = '   ola mundo em Prisma!      ';//string teste.

funcao apare(str)
  str = str ou '';
  se tipo(str) <> 'string' entao
    erro("Tipo incorreto para funcao apare, espera-se uma strig");
  fim
  local strcorte = string.corte; //eficiencia rapidez por meio de var local
  local ini = 1;
  local final = #str;
  //laço para inicio da string sem espacos
  para i = 1 , #str inicio
    local letra = strcorte(str, i , i);
    se letra <> ' ' entao
       ini = i; //se chega em uma letra marca o inicio e sai do laço
       quebre; //sai do laco.
    fim
    //poe(letra);
  fim//fim para
 
  //laco para final da string excluindo espaços
  para i = #str, 1, -1 inicio //-1 decrementa do final para o começo da string
       local letra = strcorte(str, i , i);
       se letra <> ' ' entao
         final = i;
         quebre;
       fim
       //poe (letra);   
  fim
 
  // agora cortando a string no tamanho exato sem os espaços ao redor.
  retorne strcorte(str , ini, final);//retornando a str pronta
fim

//testando, a str deve sair com os <<>> colados no inicio e fim sem espaços:
imprima( '<<' .. apare(str) .. '>>' );




Obs.: como uma função em Prisma também é uma variável, podemos reatribuir uma função em outra variável, é isto que fizemos em "local strcorte = string.corte"

e assim strcorte passa a ser uma função local, isso dá mais rapidez na execução do programa.

Obs.: os dois pontos seguidos  .. servem para concatenar strings (unir).

Bem, é isso, bons estudos no código. Use a vontade, modifique, aprimore e mande-nos um feedback.

Site: http://linguagemprisma.br4.biz/blog/uncategorized/aparando-espacos-ao-redor-da-string-trim/

rafael

Boa tarde Adalberto,

Recentemente tive um problema com essa função:

coloquei para aparar uma cadeia que só tinha espaços,
Quando eu coloquei pra concatenar ele deu concatenação de função.
Quando pedi pra mostrar o tipo ele mostrava string.
Não sei bem se isso é um erro ou uma falta de tratativa mesmo,
porque quando coloquei pra comparar se o valor era nulo antes de concatenar deu certo.

adalberto

Tem como vc postar o trecho em que usa esta função?

Se preferir, use a nova função apare que desenvolvi em C, na biblioteca string (Prisma-1.0.100 ou superior);

Use: imprima( string.apare("         uma cadeia com espaços ao redor       ")  );

Testei aqui, e se tiver só espaços ela retorna toda a string sem modificá-la, fiz a correção abaixo:



//apare string (trim) string em prisma


funcao apare(str)
  str = str ou '';
  se tipo(str) <> 'string' entao
    erro("Tipo incorreto para funcao apare, espera-se uma strig");
  fim
  local strcorte = string.corte; //eficiencia rapidez por meio de var local
  local ini = 1;
  local final = #str;
  //laço para inicio da string sem espacos
  para i = 1 , #str inicio
    local letra = strcorte(str, i , i);
    se letra <> ' ' entao
       ini = i; //se chega em uma letra marca o inicio e sai do laço
       quebre; //sai do laco.
    fim
    //poe(letra);
  fim//fim para
 
  //laco para final da string excluindo espaços
  para i = #str, 1, -1 inicio //-1 decrementa do final para o começo da string
       local letra = strcorte(str, i , i);
       se letra <> ' ' entao
         final = i;
         quebre;
       fim
       //poe (letra);   
  fim
 
  //=============== CASO TUDO SEJA ESPACO:
  se ini == 1 e final == #str entao retorne ''; fim //retorna string vazia
 
 
  // agora cortando a string no tamanho exato sem os espaços ao redor.
  retorne strcorte(str , ini, final);//retornando a str pronta
fim

str = '                                  ';
//testando, a str deve sair com os <<>> colados no inicio e fim sem espaços:
imprima( '<<' .. apare(str) .. '>>' );



rafael

A tratativa que fiz já resolveu mas segue o código:


local tab_dados = {}; //criando uma tabela vazia. (matriz) para gravar as linhas
local cont = 1;//tabelas em Prisma começam por um e nao zero.
local a = es.pabra('echo "show sessions" | nc 127.0.0.1 2001') //'a' armazena a saída do comando
se a entao
enquanto 1 inicio
local lin = a:leia()                   //lê a primeira linha de 'a'
se nao lin entao quebre fim;               //quebra o laço de repetição ao terminar as linhas.
    se string.procure(lin, '|') entao             // se a linha tiver '|' segue adiante
      local t = string.analise(lin, '|');            //cada vez que tiver um '|' a cadeia é quebrada
        se t[13]:apare()       == 'active' entao t[13] = 'ativa'       //traduzindo a saída
        senaose t[13]:apare()    == 'start'  entao t[13] = 'aberta'       //traduzindo a saída
        senaose t[13]:apare()    == 'finish' entao t[13] = 'caiu'          //traduzindo a saída
        fim
      tab_dados[cont] = {}; //cada indice de tab.. é uma nova tabela.
      tab_dados[cont].interface   = t[1] //pega o valor de t[1]
      se t[3] == '                        ' entao tab_dados[cont].usuario  = 'CONECTANDO'
      senao tab_dados[cont].usuario    = t[3]:apare() //pega o valor de t[3] caso exista
      fim
      tab_dados[cont].mac      = t[5]      //pega o valor de t[5]
      tab_dados[cont].ip      = t[7]      
      tab_dados[cont].estado      = t[13]
      tab_dados[cont].tempo      = t[15]:apare()
      
      cont = cont + 1; //incrementando para a proxima linha.
   fim //se string.procure
fim //se nao lin
  a:feche();
es.esvazie() 
senao //se a
  imprima("Erro ao ler dados")
  sis.saia(1);   
fim //se a