Tratamento de dados eólicos

1. Tratamento de dados eólicos

Rafael Batista
rafael_rss

(usa Ubuntu)

Enviado em 25/12/2011 - 16:11h

Olá pessoal, eu possuo o seguinte arquivo .csv:

data;hora;V100;V80;V60;V100_dir;V80_dir
23/7/2011;09:50;11,0924;11,10333;11,1598;79,34329;82,63939
23/7/2011;10:00;10,73268;10,61008;10,57356;84,39226;87,88141
23/7/2011;10:10;11,29236;11,11776;10,97868;86,95915;90,83371
23/7/2011;10:20;10,35653;10,3516;10,25928;84,54935;87,41072
23/7/2011;10:30;10,23556;10,25128;10,15844;107,6377;111,4632
23/7/2011;10:40;10,38312;10,32525;10,29224;100,7829;103,4373
23/7/2011;10:50;10,83277;10,57756;10,43612;91,724;95,58873
23/7/2011;11:00;9,213201;9,061516;8,985883;96,17053;100,4735
23/7/2011;11:10;10,21716;10,21736;10,18804;94,1221;98,09654
23/7/2011;11:20;8,583238;8,603241;8,575276;100,3492;102,2458
23/7/2011;11:30;11,06324;11,05291;10,98212;82,24713;86,0853
23/7/2011;11:40;10,49084;10,4392;10,35536;83,63853;87,13919
23/7/2011;11:50;8,91416;8,785287;8,780643;91,3092;96,24698
.
.
.
continua até mais de 8000 linhas.

Eu tenho um conhecimento bastante básico de shell e awk, mas sei que são ferramentas poderosas para manipular dados. As colunas desse arquivo são data (contém data e hora), hora, V100 (vento à 100 m de altura), V80 (vento à 80 m de altura), V60 (vento à 60 m), V100_dir (direção do vento à 100m) e V80_dir (direção do vento à 80m).

O que eu estou tentando fazer nesses csv's gigantes é o seguinte:

-que o meu .sh leia linha por linha do arquivo e verifique se nas colunas 3, 4 e 5 (as de velocidade de vento) o vento está entre 0 e 25m/s, ou seja 0<x>25;
- e que as colunas 6 e 7 estejam entre 0<x>360;
- verificar as colunas que tenham 0 (zero) ou estão vazias (sem nenhum valor).

- por fim ele teria que gerar um log.txt dizendo o número da linha que apresenta algum dos 3 itens acima.

Se alguém puder ajudar, agradeço muito!

Sei que devo usar o while read linha, correto?

Obrigado pela atenção!!


  


2. Re: Tratamento de dados eólicos

Alexandre Gonçalves Monteiro da Silva
alexandregms

(usa Ubuntu)

Enviado em 26/12/2011 - 17:43h

@rafael_rss, vc chegou a começar o script?
Sua idéia de usar o while para ler o arquivo de linha a linha está certo. O awk também pode ajudar a criar seu script..
Se vc já deu um passo inicial, poste aqui para darmos andamento! :-)


3. Re: Tratamento de dados eólicos

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 26/12/2011 - 19:12h

Isso mesmo ... posta o andamento que vamos ajudando ...

Aprendi muita coisa do AWK resolvendo esse problema ... valeu pela dica Alexandre ... nem precisou de loop

Mas tenta ai camarada ... seja com loop seja com awk ... e vamo junto!!


4. feito

Alexandre Gonçalves Monteiro da Silva
alexandregms

(usa Ubuntu)

Enviado em 26/12/2011 - 21:19h

Bom, como estou numa correria neste final de ano, e não sei se haverá tempo para entrar no fórum nos próximos dias então vou postar o script que vc pediu! Mas os outros espero que vc copie pra nós tentarmos resolver a partir de suas idéias :-)

@fdmarp, não usei awk, fiquei só nos "loop" e "if" mesmo! Sei que vc é fera em awk e sed, pois já me ajudou no passado!

Segue o código:



#!/bin/bash

a=1

cat arquivo.csv | grep -v data | while read line
do

echo -e "\nLINHA: $a"
new_line=`echo $line | sed 's/\,/\./g'`
for i in `seq 1 7`
do

Vel=`echo $new_line | cut -d';' -f\$i | cut -d. -f1`
if [ $i -ge 3 ] && [ $i -le 5 ]; then

if [ $Vel -ge 0 ] && [ $Vel -le 25 ]; then

echo "VEL $i - Esta entre 0 e 25: $Vel"

else

echo "VEL $i - NAO ESTA ENTE 0 e 25: $Vel"

fi

elif [ $i -eq 6 ] || [ $i -eq 7 ]; then


if [ $Vel -ge 0 ] && [ $Vel -le 300 ]; then

echo "VEL $i - Esta entre 0 e 300: $Vel"

else

echo "VEL $i - NAO ESTA ENTE 0 e 300: $Vel"

fi


else

if [ "$Vel" == "" ] || [ "$Vel" -eq 0 ] 2> /dev/null; then

echo "Coluna $i em Branco e/ou Vazia"

fi

fi

done
let a++

done






5. Re: Tratamento de dados eólicos

Rafael Batista
rafael_rss

(usa Ubuntu)

Enviado em 27/12/2011 - 01:29h

Wow, fui ver agora as respostas. Amanhã testo o script.
Essa comunidade traduz exatamente a filosofia da liberdade e ajuda característica do linux.

Muito obrigado! Mesmo.


6. Re: Tratamento de dados eólicos

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 28/12/2011 - 12:39h

Então Alexandre ... o meu script (ou comando ... nem sei se merece ser chamado de script) é muito mais simples ... só verifica se uma regra foi ou não encontrada ... o seu checa se mais de uma regra foi atingida ... etc ... ficou bem legal.

Contudo, segue meu script para você dar uma olhada ... ele tem uma performance bem legal ( mais de 35000 registros por segundo no meus testes).

cat -n arquivo.teste | tr "\t" ";" | tr , . | awk -F";" '$4 >=0 && $4 <= 25 || $5 >=0 && $5 <= 25 || $6 >=0 && $6 <= 25 || $7 >=0 && $7 <= 360 || $8>=0 && $8 <= 360 || $4 ~ /^ *$/ || $5 ~ /^ *$/ || $6 ~ /^ *$/ || $7 ~ /^ *$/ || $8 ~ /^ *$/ { print "INFO: Regra encontrada na linha ...:" $1 }' >> log.txt

também pode informar a regra que foi ferida assim:

cat -n arquivo.teste | tr "\t" ";" | tr , . | awk -F";" '(rule="1") $4 >=0 && $4 <= 25 || (rule="2") $5 >=0 && $5 <= 25 || (rule="3") $6 >=0 && $6 <= 25 || (rule="4") $7 >=0 && $7 <= 360 || (rule="5") $8>=0 && $8 <= 360 || (rule="6") $4 ~ /^ *$/ || (rule="7") $5 ~ /^ *$/ || (rule="8") $6 ~ /^ *$/ || (rule="9") $7 ~ /^ *$/ || (rule="10") $8 ~ /^ *$/ { print "INFO: Regra " rule " encontrada na linha ...:" $1 }' >> log.txt

mas eu realmente não tinha pensado que poderia ter mais de uma por linha.

É mais pra ilustrar o uso do AWK!







7. Re: Tratamento de dados eólicos

Rafael Batista
rafael_rss

(usa Ubuntu)

Enviado em 30/12/2011 - 12:03h

Então mas eu estou com um problema no sed. Referente à parte de organização dos dados, percebi que quando muda o dia, o datalogger não insere a hora, ou seja:

.
.
.
30/11/2011 23:40;
30/11/2011 23:50;
1/12/2011;
1/12/2011 00:10;
1/12/2011 00:20;
.
.
.

e assim por diante.

Estou tentando fazer um sed que detecte a linha que não tem hora e insira o 00:00 após a data.
Até agora tenho

sed 's@^/[0-31]/[0-12]/[2009-2011];@/[0-31]/[0-12]/[2009-2011] 00:00;@' teste.csv > result2.csv

Não sei se dá pra fazer com esses limites [0-31] [2009-2011] ou precisa definir número por número, sempre de zero a nove. Quando rodo aparece isso: "sed: -e expressão #1, caractere 61: Intervalo final inválida"


8. Re: Tratamento de dados eólicos

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 30/12/2011 - 16:59h

sed 's/^\([0-9]\{1,2\}\)\/\([0-9]\{1,2\}\)\/\(20[09-11]\{2\}\)\;/\1\/\2\/\3 00:00\;/'

ou

sed 's/^\([0-9]\{1,2\}\)\/\([0-9]\{1,2\}\)\/\(20[09..11]\{2\}\)\;/\1\/\2\/\3 00:00\;/'



9. Re: Tratamento de dados eólicos

Rafael Batista
rafael_rss

(usa Ubuntu)

Enviado em 30/12/2011 - 18:13h

Olá pessoal. Obrigado pelas respostas.
Após algum tempo de leitura no site do aurélio e a ajuda de vcs cheguei nisso:

sed 's/\([0-9]\{1,2\}\/[0-9]\{1,2\}\/[0-9]\{4\}\);/\1 00:00;/' teste.csv > result2.csv

Que insere corretamente o 00:00 nas datas que não tem. Um problema a menos :P
Agora partirei pras verificações de valores (acima questionada).


10. Re: Tratamento de dados eólicos

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 31/12/2011 - 09:17h

sed 's/^\([0-1]\{0,1\}[0-9]\{1\}\|3[0-1]\)\/\([1-9]\{1\}\|1[0-2]\)\/\(20[09..11]\{2\}\)\;/\1\/\2\/\3 00:00\;/'






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts