Como otimizar o script (Uso For ou While?)

1. Como otimizar o script (Uso For ou While?)

Vinicius Miqueloti
Miqueloti

(usa Lubuntu)

Enviado em 05/06/2014 - 16:51h

Boa tarde caros companheiros,

Tenho um script que simplesmente obtém valores de um arquivo .csv para gerar outros três arquivos .csv que serão utilizados posteriormente para a importação de massa de dados em um sistema de terceiros no qual não possuo acesso, portanto preciso fazer estes CSV's para fornece-los ao cliente que irá importar!

Minha dúvida é como melhorar o desempenho do script.

Usei for $variavel in `cat arquivo.csv`, mais sei que poderia ter utilizado while e direcionar o arquivo no final para ler linha a linha. Qual dos dois oferece maior velocidade no loop?

Por fim, segue o código do script abaixo, se alguém sugerir mudanças fora a escolha do loop que melhorar o desempenho será bem vindo a sugestão.

Por fim, que linguagem eu poderia estar utilizando para reescrever o código e dar-lhe maior velocidade? No código abaixo, demoro de 4 a 5 segundos para escrever as informações de uma linha do .csv de entrada para os outros três .csv de saída.


#!/bin/bash
if [ -e $1 ]; then
#Define o nome dos arquivos de saída do script e escreve-os com o seu cabeçalho.
dataHora=`date +%Y%m%d%H%M%S`
output_file1=import_stations_file1_$dataHora.csv
output_file2=import_stations_file2_$dataHora.csv
output_file3=import_stations_file3_$dataHora.csv
echo ADDRESSCODE\,ADDRESSLINE2\,ADDRESSLINE3\,CITY\,COUNTRY\,COUNTY\,DESCRIPTION\,DIRECTIONS\,FORMATTEDADDRESS\,GEOCODE\,LATITUDEY\,LONGITUDEX\,OBJECTNAME\,ORGID\,PARENT\,PLUSSFEATURECLASS\,PLUSSISGIS\,POSTALCODE\,REFERENCEPOINT\,REGIONDISTRICT\,SITEID\,STADDRDIRPRFX\,STADDRDIRSFX\,STADDRNUMBER\,STADDRSTREET\,STADDRSTTYPE\,STADDRUNITNUM\,STATEPROVINCE\,STREETADDRESS\,TIMEZONE > $output_file1
echo CHANGEBY\,CHANGEDATE\,CLASSSTRUCTUREID\,DESCRIPTION\,HASCHILDREN\,HASPARENT\,LOCATION\,ORGID\,PARENT\,SADDRESSCODE\,SERVICEADDRESSCODE\,SITEID\,STATUS\,STATUSDATE\,SYSTEMID\,TYPE > $output_file2
echo LOCATION\,SITEID\,ALNVALUE\,ASSETATTRID\,CHANGEBY\,CHANGEDATE\,INHERITEDFROMITEM\,ITEMSPECVALCHANGED\,LINKEDTOATTRIBUTE\,LINKEDTOSECTION\,MANDATORY\,MEASUREUNITID\,NUMVALUE\,ORGID\,SECTION\,TABLEVALUE > $output_file3
export LC_ALL=C
IFS=$'\n'
for data in `cat $1 | grep -v '^\w\w;#N/D;' | grep -v '^\w\w;;' | sort | uniq`
do
#Obtém as variáveis da planilha OI para escrever nos arquivos de importação os dados da estação.
uf=`echo $data | awk -F ";" '{ print $1 }'`
loc=`echo $data | awk -F ";" '{ print $2 }'`
est=`echo $data | awk -F ";" '{ print $3 }'`
uf_loc_est=`echo $data | awk -F ";" '{ print $4 }'`
uf_est=`echo $data | awk -F ";" '{ print $5 }'`
tipo_est=`echo $data | awk -F ";" '{ print $6 }'`
latitude=`echo $data | awk -F ";" '{ print $7 }' | sed s/\,/./`
longitude=`echo $data | awk -F ";" '{ print $8 }' | sed s/\,/./`
municipio=`echo $data | awk -F ";" '{ print $9 }'`
endereco=`echo $data | awk -F ";" '{ print $10 }'`
dataHora=`date +%Y-%m-%dT%H:%M:%S-03:00`

#Escreve as informações da estação no primeiro arquivo
echo $uf_loc_est\,\,\,$municipio\,BR\,\,Endereço geo-referenciado $uf_loc_est\,\,\"$endereco\"\,\,$latitude\,$longitude\,\,OI_ORG\,\,\,0\,\,\,\,OI_SITE\,\,\,\,\,\,\,\,\, >> $output_file1 2>> error_log_$output_file1

#Escreve as informações da estação no segundo arquivo
echo OI\,$dataHora\,1373\,Estação $uf_est\,0\,1\,$uf_loc_est\,OI_ORG\,$loc\,$uf_loc_est\,\,OI_SITE\,OPERATING\,$dataHora\,OI_$uf\,OPERATING >> $output_file2 2>> error_log_$output_file2

#Escreve as informações da estação no terceiro arquivo
echo $uf_loc_est\,OI_SITE\,$tipo_est\,TIPO_EST\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3
echo $uf_loc_est\,OI_SITE\,\,ALTITUDE\,OI\,$dataHora\,0\,0\,\,\,0\,M\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3 #Onde obter altitude?
echo $uf_loc_est\,OI_SITE\,$est\,NOME\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3
echo $uf_loc_est\,OI_SITE\,$loc\,LOCALID\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3
echo $uf_loc_est\,OI_SITE\,$est\,SIGLA\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3
echo $uf_loc_est\,OI_SITE\,\,NANATEL\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3 #Onde obter número anatel?
echo $uf_loc_est\,OI_SITE\,Existente\,SITUACAO\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3 #Onde obter situação? Será sempre Existente?
echo $uf_loc_est\,OI_SITE\,\,LATITUDE\,OI\,$dataHora\,0\,0\,\,\,0\,\,$latitude\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3 #Posso converter virgula para ponto em latitude?
echo $uf_loc_est\,OI_SITE\,\,LONGIT\,OI\,$dataHora\,0\,0\,\,\,0\,\,$longitude\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3 #Posso converter virgula para ponto em longitude?
echo $uf_loc_est\,OI_SITE\,\"$endereco\"\,ENDEREC\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3 #Posso converter virgula para ponto em endereço?
echo $uf_loc_est\,OI_SITE\,\,BAIRRO\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3 #Onde obter bairro?
echo $uf_loc_est\,OI_SITE\,\,LOCALIZ\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3 #Onde obter localização?
echo $uf_loc_est\,OI_SITE\,$municipio\,MUNICIP\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3
echo $uf_loc_est\,OI_SITE\,\,DISTRIT\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3 #Onde obter distrito?
echo $uf_loc_est\,OI_SITE\,\,CEP\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3 #Onde obter CEP?
echo $uf_loc_est\,OI_SITE\,$uf\,ESTADO\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3
echo $uf_loc_est\,OI_SITE\,\,NTORRES\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3 #Onde obter numero de torres?
echo $uf_loc_est\,OI_SITE\,$uf_loc_est\,ESPTORR\,OI\,$dataHora\,0\,0\,\,\,0\,\,\,OI_ORG\,\, >> $output_file3 2>> error_log_$output_file3 #Onde obter ESPTORR?
done
echo Processamento concluido. Lembre-se de verificar se existe conteudo no arquivo error_log\*\.
else
echo Arquivo inexistente. Verifique se digitou o nome do arquivo corretamente\, ou se necessita informar o caminho.
fi


Edit:
Arrumei um servidor Risk aqui na empresa para processar o script, agora ao invés de longas 36 horas para processar todos os dados, levei apenas 12 minutos o_O

Mais fica a dúvida de como poderia melhorar para executar em meros notes simples!



  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts