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.
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!
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!