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 [EMAIL PROTECTED]:
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 [EMAIL PROTECTED]:
[EMAIL PROTECTED] -- Tue, 22 Jul 2008 14:43:50 -0300:
Cristiano Panvel [EMAIL PROTECTED] -- 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:
mmddhhmmss.ss. 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
$