#|=============================================================================== #|SELETOR_PADRAO | CLASS - Seletor de arquivos | SHSF | #|------------------------------------------------------------------------------| #| Esta classe localiza arquivos dentro de uma determinada data/hora #|------------------------------------------------------------------------------| #| Objetos desta classe: | #| DATAIN = REPOSITORIO DOS DADOS DE ENTRADA | #| DATAOUT = REPOSITORIO DOS DADOS CONVERTIDOS | #| CONVERTER = PROGRAMA CONVERSOS DE DADOS | #| SELECTOR = PROGRAMA SELETOR DE DADOS - SELECIONA CONFORME UMA DATA E HORA | #|------------------------------------------------------------------------------| #| Metodos desta classe: | #| new : Metodo constutor: Cria um objeto desta classe | #| run : roda o objeto, processando a selecao de dados | #|------------------------------------------------------------------------------| #| Dependencias: | #|------------------------------------------------------------------------------| #| HISTORICO #| 2006-05 - Sergio Henrique: Versao original package seletor_padrao; use strict; require Exporter; our @ISA =qw(Exporter); our @EXPORT =qw(new name); use Getopt::Std; # Biblioteca para argumentos de linha de comando use Time::Local; # Biblioteca padrao para processar data e hora # Exemplo $time=timelocal($seg,$min,$horas,$dia,$mes-1,$ano-1900); # OU $time=timegm($seg,$min,$horas,$dia,$mes-1,$ano-1900); # # Exemplo 2 > Somando 24 horas a uma data # my $newtime=$time + 60*60*24; # #Exemplo 3 < subtraindo 10 minutos # my $newtime=$time -60*10; # # Exemplo 4 Imprimindo a data # print scalar(localtime($timei)),"\n"; # # Exemplo 5 Comparando datas # if (($timef > $time) && ($timei< $time) { # use Cwd; # biblioteca para obter o path ou diretorio de trabalho use Glib; # Biblioteca de de subrotinas de uso geral use File::Copy; #|=============================================================================== #|new | Metodo construtor | SHSF | #|------------------------------------------------------------------------------| #| Carrega arquivos de configuracao (nome_da_classe.conf) | | #|------------------------------------------------------------------------------| sub new { my $proto = shift; my $class = ref($proto) || $proto; #Obtem uma referencia para estanciar objetos desta classe my $self = {}; # Array de propriedades desta classe $self->{NAME} = shift; # Propriedade NAME #{ OBTEM DIRETORIO DE TRABALHO (ROOT) my $key=keys(%ENV); my $root; if ($key="CONVERDIR"){$self->{ROOT}=$ENV{$key};} print "$self->{ROOT}\n"; #} #{ Define as propriadades iniciais desta classe de objetos $self->{DATAIN}=undef; $self->{SELETOR}=undef; $self->{INFILE}="*"; $self->{FLUXO}=undef; $self->{CODES}=undef; $self->{SUBTYPES}=undef; $self->{OBSDATE}=undef; $self->{CFILE}=undef; $self->{TMPDIR}=undef; $self->{TIMEWINDOW}=undef; print "$self->{DATAIN}\n"; print "$self->{TMPDIR}\n"; # Abencoa classe "Convert_arc" fornecendo seu proprio nome ($self) # e um indereco $class para criacao de multiplas estancias desta classe # e para permitir que a classe seja utilizada no programa principal #{ bless ($self, $class); #} return $self; } # Fim do Metodo Construtor #|=============================================================================== #|Metodo run | Roda conversao | MCT-INPE-CPTEC | #|------------------------------------------------------------------------------| #| Este metodo roda a conversao de dados para ODS segundo as propriedades #| desta classe, que estao definidas nos arquivos convert_tipo.conf #| #| O processo de conversao envolve os seguintes passos: #| a) identidicacao dos arquivos de entrada (diretorio DATAIN) #| b) Selecao dos aquivos conforme data e tipo #| c) Concatenacao dos arquivos de entrada em um unico arquivos #| (CFILE no diretorio SELECTED) #| d) Processar a conversao do arquivos CFILE para formato intermediario (CDL) #| e) Converter o CDL para ODS usando o software NCGEN #| #| Os arquivos de entrada podem estar em diretorios do seguintes tipos: #| {DATAIN}FLUXO_XXX/TTTT/SS/YYYY/MM/DD #| #| onde YYYYMM = ano e mes #| FLUXO_XXX = Tipo do Fluxo #| DD = Dia #| TTTT = Codigo de telecomunicacoes (opcional) Ex.: IUCN, IUCS, etc. #| SS = SUBTIPO DE DADOS (opcional) Ex.: ir,wv, etc #| #|------------------------------------------------------------------------------| #| DEPENDENCIAS #| #|------------------------------------------------------------------------------| #| HISTORICO #| 20060530 - Sergio Henrique - Versao original sub run { #{ configuracoes do sistema operacional # # barra de separacao (windows: b$="\\" ) (linux: b$="/") # opcao do mkdir (windows: $p=" ") (linux $="-p") my $b="/"; my $p="-p"; my $self = shift; my $code=$self->{CODES}; my $subtype=$self->{SUBTYPES}; my @code=split(/;/,$code); my @subtype=split(/;/,$subtype); my $infile=$self->{INFILE}; my @infile; my $step=24*60*60; if (index($infile,"\$H")>0){$step=1*60*60;} print "CODE = $code \n"; print "SUBTYPE =$self->{SUBTYPES} \n"; print "\n Searching for $infile \n"; #{ Obtendo data inicial e data final ($date1 e $date2) #------------------------------------------------------------------------------------ # para garantir que todos os dados da janela de tempo sejam considerados # a data final $date2 tera seu valor atribuido, nao apenas pela # janela de tempo, mas tambem pelo passo de tempo determinado # na forma do nome dos arquivos (variavel $step) # Desta forma $date considera o que for maior TIMEWINDOW ou $STEP #----------------------------------------------------------------------------------- my $date1=undef; my $date2=undef; my $dt=$self->{TIMEWINDOW}*2; if ($dt < $step) { $date1=$self->{OBSDATE}-$self->{TIMEWINDOW}; $date2=$date1+$step }else{ $date1=$self->{OBSDATE} - $self->{TIMEWINDOW}; $date2=$self->{OBSDATE} + $self->{TIMEWINDOW}; } #} #----------------------------------------------------------------------------------------- # Para todos os horarios da janela de tempo, obter o nome de todos os arquivos # que podem conter os dados desejados # # Esta parte contem 3 " loops" aninhados: # Loop 1 - Loop da janela de tempo- ($obsdate varia de date1 a $date2 em passos de $step) # loop 2 - Loop de subtipos (realizado tantas vezes quantos os forem os subtipos existentes) # loop 3 - Loop de codigos ( realizado tantas vezes quantos forem os codigos de telecomunicacoes # utilizados para reportar o tipo de dados desejado) #--------------------------------------------------------------------------------- #{ my $aux=""; my $obsdate=$date1; #loop1 while ($obsdate <= $date2) { #{ Obtendo data no calendario gregoriano e dia juliano # e substituindo estes parametros nos nomes dos arquivos my ($seg,$minuto,$H,$D,$M,$Y,$SM,$J)=localtime($obsdate); $M=$M+1; $Y=$Y+1900; if ($D<10){$D="0".$D;} if ($M<10){$M="0".$M;} if ($H<10){$H="0".$H;} if ($J<10){$J="0".$J;} if ($J<100){$J="0".$J;} my $auxfile=$infile; # Modificado SHSF 06/02/2007 $auxfile=~s/\$Y/$Y/g; $auxfile=~s/\$M/$M/g; $auxfile=~s/\$D/$D/g; $auxfile=~s/\$H/$H/g; $auxfile=~s/\$J/$J/g; #} print "\nTrying to find $auxfile in: \n"; #loop2 foreach $subtype (@subtype) { #loop3 foreach $code (@code) { # Modificado SHSF 06/02/2007 #my $dir=$self->{DATAIN}.$self->{FLUXO}.$code.$subtype.$Y."/".$M."/".$D."/"; my $dir=$self->{DATAIN}.$self->{FLUXO}.$code.$subtype; print "$dir\n"; `mkdir $p $dir`; @infile=<$dir*$auxfile*>; my $aux2=join(" ",@infile); if (length($aux2)>1){$aux=$aux.$aux2." ";} } } $obsdate=$obsdate+$step; # Proximo $obsdate } my @files=split(/ /,$aux); my $count=@files; if ($count<1) { print "\nFiles not founded !\n"; die }else{ print "\n Files founded = $count \n" } #{ Juntar arquivos de entrada em um unico arquivo #--------------------------------------------------------------------------------------------- # Nesta parte os arquivos localizados nos seus diretorios sao concatenados para produzir # um unica arquivos de entrada, para seu utilizado no processo de conversao #-------------------------------------------------------------------------------------------- print "\n\n Catting files .. \n"; unlink $self->{CFILE}; my $infile; foreach $infile (@files) { print "cat $infile >> $self->{CFILE}\n\n"; my $log=`cat $infile >> $self->{CFILE}`; } #} } # Fim do metodo run