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: 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 -- [EMAIL PROTECTED], [EMAIL PROTECTED] \`' [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED] ` Get my public GPG key in http://rollingbits.tripod.com/mykey.html
signature.asc
Description: Digital signature
------------------------- Histórico: http://www.fug.com.br/historico/html/freebsd/ Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd