Conversão de unidades CSV

1

Eu tenho um arquivo CSV que parece com o seguinte:

miami,20,in
lansing,2,cm
austin,3,mm
chicago,5,miles
phoenix,2,feet

O primeiro campo é o nome, o próximo campo é o valor numérico e o terceiro campo indica as unidades. Eu listei todas as unidades que meu conjunto de dados tem no momento, mas não está limitado a elas, pois espero que o conjunto de dados mude e exija diferentes unidades de medida ao longo do tempo.

Eu quero poder processar este arquivo CSV em um script para que todos os meus valores sejam convertidos em uma unidade comum, polegadas, e sejam listados ao lado do nome. Então, deve ser algo como isto:

miami,20
lansing,0.78740157
austin,0.11811024
chicago,316800
phoenix,24

Eu descobri que há uma ferramenta de conversão de unidades units , que é exatamente o que eu estou procurando usar para converter minhas unidades, pois meus dados contêm uma mistura de unidades métricas e imperiais.

Por exemplo, se eu quisesse converter minha última linha de dados em polegadas, eu faria isso

units 2cm in -t

O que me daria

0.78740157

Atualmente, estou procurando ajuda sobre como usar esse comando em um script e exibi-lo no formato que descrevi (segundo bloco de código). Os dados CSV estão atualmente armazenados em uma variável chamada $citydata em um script bash. Atualmente é uma string.

    
por Varludea 26.03.2015 / 12:00

3 respostas

1

Aqui está um comando linear :

$ awk -F, '{system("printf " $1 ",;units " $2$NF " in -t ")}'  file
miami,20
lansing,0.78740157
austin,0.11811024
chicago,316800
phoenix,24
  • O comando system chama os outros comandos do shell no comando awk . Então, em primeiro lugar que imprime o primeiro campo de arquivo SCV por "printf " $1 ", seguido por um coma único , ; em seguida, chama o comando units com os segundos campos $2 e last $NF como sua entrada.

Observe que, quando você quiser usar o comando system em awk , , inclua esses comandos e suas opções com aspas duplas, exceto awk opções nele.

    
por 26.03.2015 / 12:47
1

Você poderia fazer algo assim:

#!/usr/bin/env bash

## The data is in the $citydata array
citydata=( $(cat file) )

## For each element of the array
for i in "${citydata[@]}"
do
    ## Read the fields, splitting on commas
    IFS="," read -r city val unit <<<"$i"
    ## Print out the city and the value converted to inches
    echo "$city,$(units $val$unit in -t)"
done

Dados os dados em seu exemplo, o acima produz

miami,20
lansing,0.78740157

NOTAS

  • O script espera que cada linha seja composta por três campos separados por vírgulas.
  • As vírgulas aninhadas
  • irão quebrá-lo, por exemplo "Washington, DC",20,cm .
  • Ele pode lidar com qualquer unidade que units possa converter.
por 26.03.2015 / 12:13
0

Se você quiser usar a função units , isso é fácil com awk

awk -F, -v OFS=, '{"units "$(NF-1)$NF" in -t"|getline $(NF-1);NF=NF-1}1'
    
por 26.03.2015 / 12:12