Prisma - How to handle semicolon files "csv"?

Asked

Viewed 65 times

0

The title of the question refers to csv because it is widely used and has the same logic but my server produces the following output:

 ifname  |        username        |    calling-sid    |       ip        | type  | comp | state  |   uptime   
---------+------------------------+-------------------+-----------------+-------+------+--------+------------
 ppp10   | anamariade             | 00:1A:3F:74:03:93 | 10.10.10.3      | pppoe |      | active | 7.02:26:48 
 ppp365  | fabianepinow           | 98:DE:D0:FF:AE:C1 | 10.10.10.112    | pppoe |      | active | 6.19:21:57 
 ppp621  | nilsonbrito            | 78:44:76:8D:57:07 | 10.10.10.77     | pppoe |      | active | 6.19:21:31 
 ppp405  | andreparente           | DC:9F:DB:EE:CA:24 | 10.10.10.232    | pppoe |      | active | 6.16:54:32 

I want every line pppX is an index of the table and within the table its respective columns: tab[0].username tab[0].ip, I’ve read the manual but the way I did the indexes don’t match:

local tabfinal = {}                           // declara uma nova tabela
local saida = es.abra("saida.txt","leitura")  // abrindo o arquivo
    local texto = saida:leia("*t")            // lê todo conteúdo
    local tabtemp = texto:analise("|")        // quebraria o texto em vários índices
    para i,v em pares(tabtemp) inicio         // laço para preencher a tabela final
        se nao v:procure("|") entao           // testa o separador
        tabela.insira(tabfinal,1,v)           // alimenta a tabela
        fim
    fim

1 answer

1


I created a function that processes the string as it is in your question, did not read the file, put the string straight, but just adapt according to your need:

(Note: double brackets are used for multiline strings)

For those interested link to the manual:

http://linguagemprisma.br4.biz/blog/manual-basico/

 local s = [[
     ifname  |        username        |    calling-sid    |       ip        | type  | comp | state  |   uptime   
    ---------+------------------------+-------------------+-----------------+-------+------+--------+------------
     ppp10   | anamariade             | 00:1A:3F:74:03:93 | 10.10.10.3      | pppoe |      | active | 7.02:26:48 
     ppp365  | fabianepinow           | 98:DE:D0:FF:AE:C1 | 10.10.10.112    | pppoe |      | active | 6.19:21:57 
     ppp621  | nilsonbrito            | 78:44:76:8D:57:07 | 10.10.10.77     | pppoe |      | active | 6.19:21:31 
     ppp405  | andreparente           | DC:9F:DB:EE:CA:24 | 10.10.10.232    | pppoe |      | active | 6.16:54:32 
    ]]

    funcao tab_remova(tab,c) //tabela sempre é passada por referência
      local removaitem = tabela.remova;
      local str_apare = string.apare;
      para i=1,#tab inicio
        se tab[i] == c entao 
          removaitem(tab,i); //remove este indice da tabela e recompoe a tabela.
        fim     
      fim
      para i=1,#tab inicio
        tab[i]=str_apare(tab[i]); //apara os espaços ao redor das strings;
      fim
    fim

    funcao obt_tab(s)
      local lin, col,tab,tmp=nulo,nulo,{},nulo;
      lin = s:analise('\n');
      se nao lin entao retorne nulo, 'erro ao analisar string'; fim
      col = lin[1]:analise('|'); //guardamos os nomes da colunas aqui 
      tab_remova(col,'|');//remove todos os '|';
      tab_remova(lin,'\n');//remove todos os '\n' em lin
      tabela.remova(lin,2);//remove o -----------+----------- ...
      //agora o indice 3 é realocado para o 2, o 4 para o 3 e cada indice um abaixo.
      para i=2,#lin inicio //um valor para cada item em col;
        tmp = lin[i]:analise('|');
        tab_remova(tmp,'|');//remove os '|';
        tab[#tab+1] = {};// tab[i] = {campo1=valor,campo2 = valor2 ...}
        para j=1,#col inicio
          tab[#tab][col[j]] = tmp[j];//tab[i] [nomeCol] = tmp[j]
          //imprima(tmp[j]);
        fim
      fim
      retorne tab;
    fim 



    /* -------------------- TESTANDO ---------------- */


    local tab = obt_tab(s);

    //teste percorrendo toda a tabela:
    para i = 1, #tab inicio
      poe'\n-----------------------\n';
      //cada indice é uma nova tabela (recorde);
      para k,val em pares(tab[i]) inicio  // a função iteradora pares() percorre a tabela devolvendo chave/valor.
        imprima(k,'=',val);
      fim
    fim

    //teste usando indice manual [1]:
    poe'\n-------------- *** -------------\n';
    imprima(tab[1].username, tab[1].ip);
    poe'\n-------------- FIM -------------\n';
  • Your code was well worked out! Here I was able to do only one string:analyze("|") and fill the table from the second index.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.