Transformando porcentagens em decimais?

0

Eu tenho um arquivo CSV que tem porcentagens aqui e ali expressas em formato de texto, por exemplo

173.91,0.00%,36.10%,1.71

A questão do dia é como transformar esse exemplo em

173.91,0,0.3610,1.71

Editar para adicionar: você não deve confiar na posição dos campos de porcentagem. Você deve detectá-los com base no sinal%.

    
por user57153 19.01.2014 / 23:49

2 respostas

1
$ echo '173.91,0.00%,36.10%,1.71'|perl -pe 's{\d+\.\d+%}{$&/100}eg'
173.91,0,0.361,1.71

O regex procura por um float com% e nas últimas chaves avalia a expressão: string $& dividida por 100.

    
por 20.01.2014 / 01:15
1

Veja um exemplo de awk :

$ awk -F, '{sub(/%/,"",$2); sub(/%/,"",$3); \
      printf("%.2f,%.0f,%.4f,%.2f\n"), $1, $2, $3/100, $4}' ex.txt 
173.91,0,0.3610,1.71

Detalhes

  1. Dizemos a awk para dividir o conteúdo do arquivo ex.txt usando vírgulas, -F, .
  2. sub(/%/,"",$2) & sub(/%/,"",$3) tira os sinais de porcentagem.
  3. printf("%.2f,%.0f,%.4f,%.2f\n") se encarrega de formatar tudo.
  4. Os parâmetros para printf , $1 , $2 , $4 são apenas o conteúdo do arquivo, o terceiro, $3/100 que dividimos por 100 para obtê-lo na forma decimal.

Melhorando o design

Uma coisa que podemos melhorar imediatamente, assumindo que não nos importamos com sinais de porcentagem, é removê-los completamente usando gsub para substituí-los globalmente.

$ awk -F, '{sub(/%/,"",$0); \
      printf("%.2f,%.0f,%.4f,%.2f\n"), $1, $2, $3/100, $4}' ex.txt 
173.91,0,0.3610,1.71
    
por 20.01.2014 / 01:29

Tags