[FUG-BR] [off] [longo] Pegando datas timestamp em arquivo

rollingbits (aka Lucas) rollingbits em gmail.com
Sexta Julho 25 21:15:17 BRT 2008


On Thu, Jul 24, 2008 at 10:02:05AM -0300, Ederson de Moura wrote:
> Oi Cristiano,

Olá todos,

> Acho que você teria que fazer uma algoritmo para isso, eu tentaria
> fazer algo assim, independentemente da linguagem a ser usada:
> 
> 1) Leria todo o arquivo e armazenaria os valores em um vetor, que
> fica mais fácil trabalhar depois.

É meio problemático trabalhar com algoritmos genéricos neste tópicio
porque esbarra-se nas limitações das linguagens disponíveis: como
declarar um vetor em sh, por exemplo?

Estando num shell, é mais interessante pensar em termos de
filtros. Por exemplo, se o shell for sh, pode-se redirecionar o
conteúdo do arquivo de tempos para a entrada de um loop while. O while
pode, então, ler uma linha por vez com read e fazer qualquer coisa com
ela, tipo

$ while read l; do echo $l; done < $arquivo

vai fazer o mesmo que

$ cat $arquivo

o que acaba não sendo o problema aqui.

> 2) Pega a primeira data "timestamp" do arquivo.
> 
> 3) Com a primeira data encontrada. Você teria que encontrar agora
> uma função ou criar uma, que calculasse o intervalo do tempo ate a
> próxima data a ser encontrada, no seu caso os 2 minutos, então
> quando o intervalo da data timestamp for diferente desse tempo, você
> para de ler, e guarda ou escreve essas datas em algum lugar, depois
> lê novamente a próxima data e calcula o intervalo, e assim por
> diante ate chegar ao final do arquivo.
> 
> Não estou pensando aqui na questão de desempenho, se você tiver que
> extrair esses dados todos os dias e processar, ai talvez seria
> interessante ler o arquivo recursivamente da data onde parou a
> ultima leitura.

Na verdade, tem duas coisas envolvidas na pergunta (ou duas melhores
soluções, como queira): uma é baseada no que está escrito acima mas,
se o problema fosse tão grande, a pergunda não seria, assim, tão
elementar, né? Tipo,

$ apropos foo

lista todas as páginas manual que incluem referências à foo. A outra
melhor solução está em se achar um método (melhor método) que usa as
coisas (programas, essencialmente) disponíveis para uma resposta
rápida. Fiz um início disto na inserção anterior e nada diz que é
único: foi o primeiro que pensei e certamente me levaria a /uma/
resposta no menor tempo possível, com outras pessoas poderia ser
diferente.

Dessa forma, pode-se considerar que o problema não é, assim, tão
rotineiro a ponto de justificar uma solução como a apresentada no
email do Ederson: já tive diversas oportunidades de usar uma lista
como esta uma única vez. E uma lista grande, por sinal.

> 2008/7/23 Cristiano Panvel <cristiano.panvel em gmail.com>:
> > Oi, o banco he MySQl versao 3.0, e nem posso pensar em atualizar
> > por enquanto...
> >
> > Tenho uma lista grande com esses valores em timestamp, eu tenho
> > que achar o intervalo dessas datas comecando ler pelo comeco do
> > arquivo, primeira linha he:
> >
> > 20070925145857.714132
> >
> > Quando o intervalo da hora mudar de 145857 para 151100 eu paro de
> > ler e imprimo essas duas linhas em um algum lugar, porque irei
> > precisar desses valores depois, e continou lendo da linha que
> > parei ate o final he mais ou menos isso.Nao sei se tem essa opcao
> > no MySQL pelo na versao 3 eu nao achei
> >
> > 2008/7/22 Tiago Drumond <kdc_vk em hotmail.com>:
> > eschoedler em viavale.com.br -- Tue, 22 Jul 2008 14:43:50 -0300:
> > > "Cristiano Panvel" <cristiano.panvel em gmail.com> -- Tue, Jul 22, 2008 1:03 PM:
> > >
> > > Oi pessoal,
> > > Tenho um arquivo no formato timestamp extraido do banco. Dessa
> > > forma:
> > > 
> > > 20070925145857.714132
> > > 20070925145859.714131
> > > 20070925145900.714130
> > > 20070925145902.714129
> > > 20070925145904.714129
> > > 20070925145906.714128
> > > 20070925145907.714127
> > > 20070925145909.714126
> > > 20070925151100.714126
> > > 20070925151110.788127
> > > 20070925151200.725128
> > > 
> > > Eu gostaria que quando o intervalo fosse diferente de 1 minuto
> > > ele parase de processar, e pegase somente a data de inicio e
> > > fim.  Ex: 20070925151201.714127, 20070925151201.714127 Alguem
> > > sabe algum commando ou expressao para fazer isso.

As datas parecem seguir a ordenação little-endian:
yyyymmddhhmmss.ssssss. Neste ponto minha ajuda fica menos exata: estou
migrando do linux par ao FreeBSD e ainda não tenho todas as respostas
de cabeça. O programa date do linux consegue somar datas e pode ser
usado para resolver o problema; a versão do FreeBSD deve ter recursos
parecidos e, neste caso, também pode ser usada na solução. A outra
alternativa seria decompor a data lida e usar os recursos algébricos
do sh (no meu caso) para se ter uma resposta. De qualquer forma, o
algoritmo não muda muito. Aproveitando-se da notação (observe que isto
não é exatamente óbvio), para saber se o intervalo entre duas datas é
maior que 1 min pode-se somar 1 min na menor (considera-se a notação
na soma) e comparar o resultado com o outro valor (considera-se as
datas como números). Se o valor somado for menor que o outro, o
intervalo é maior que 1 min (só matemática). Sendo criativo, pode-se
decompor as datas de diversas formas: lembro de 2, logo de cara:

$ year=$(echo $data | cut -c1-4)

e

$ data=$(echo $data | cut -d. -f1)
$ ano=$(( $data / 10000000000 ))

e o fato da primeira versão ser mais compacta não significa que ela e
a melhor: também tem o mês, dia... além o numero de fork() e o tempo
de execução de cada comando. Se eu usasse csh, os comandos
apresentados não funcionariam (óbvio) mas a idéia é a mesma. Um outro
ponto é que o tempo gasto na otimização pode não valer o esforço e
ainda assim, um script in-line resolve o problema muito mais
rapidamente que sem usar recurso computacional algum se a lista for
realmente grande e o usuário não precisa dominar nada além do shell
que estiver usando.

Lc

PS: Só constar:
   - stamp (en) == carimbo, marca, selo (pt)
   - timestamp (en) == time stamp (en) == marca temporal (pt)
não é nome de formato de tempo.

-- 
,-. rollingbits -- rollingbits em gmail.com, rollingbits em globo.com
\`' lucasnm em ig.com.br, rollingbits em terra.com.br, rollingbits em yahoo.com
 `  Get my public GPG key in http://rollingbits.tripod.com/mykey.html
-------------- Próxima Parte ----------
Um anexo não texto foi limpo...
Nome  : não disponível
Tipo  : application/pgp-signature
Tam   : 197 bytes
Descr.: Digital signature
Url   : http://www.fug.com.br/historico/html/freebsd/attachments/20080725/2b871fa9/attachment.bin 


Mais detalhes sobre a lista de discussão freebsd