Pokaż wyniki 1 do 5 z 5

Temat: skrypt do obsługi pliku txt

  1. #1

    Domyślnie skrypt do obsługi pliku txt

    Witam.
    Potrzebuje napisac skrypt w Perlu który bedzie mi wyłapywał interesujące mnie informacje a następnie rysował histogram...
    Zadanie chyba nie jest proste... i nie mam pomysłu jak za to sie zabrac.. może pokaże na przykładzie ...

    12:02:12.122 safdjaismdasdaddadasdsd,dasdsd,sadad,asd,da,s ParametrA time=1234milsec
    12:03:12.122 safdjaismdasdaddadasdsd,dasdsd,sadad,asd,da,s ParametrB time=1234milsec
    12:04:12.122 safdjaismdasdaddadasdsd,dasdsd,sadad,asd,da,s ParametrC time=1234milsec
    12:05:12.122 safdjaismdasdaddadasdsd,dasdsd,sadad,asd,da,s ParametrD time=1234milsec

    No i teraz chodzi żeby wydobyc te czasy time dla różnych Patametr(A,B,C,D)
    i przedstawic na histogramie...

    oczywiscie to byl tylko przykład ... plik jest olbrzymi kilkadziesiąt tysięcy lini... jest 6 parametrów do wydobycia... czyli 6 wykresów...

    Prosze o jaką kolwiek wskazówke, porade, obojętnie co...

  2. #2
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Krotkie i dziala :P

    Plik wejsciowy ma u mnie format (dodalem linie aby miec niektore wyniki x2 a inne x1):
    Kod:
    12:02:12.122 safdjaismdasdaddadasdsd,dasdsd,sadad,asd,da,s ParametrA time=1234milsec
    12:03:12.122 safdjaismdasdaddadasdsd,dasdsd,sadad,asd,da,s ParametrB time=1234milsec
    12:04:12.122 safdjaismdasdaddadasdsd,dasdsd,sadad,asd,da,s ParametrC time=1234milsec
    12:05:12.122 safdjaismdasdaddadasdsd,dasdsd,sadad,asd,da,s ParametrD time=1234milsec
    12:03:12.122 safdjaismdasdaddadasdsd,dasdsd,sadad,asd,da,s ParametrB time=1234milsec
    12:04:12.122 safdjaismdasdaddadasdsd,dasdsd,sadad,asd,da,s ParametrC time=123milsec
    12:05:12.122 safdjaismdasdaddadasdsd,dasdsd,sadad,asd,da,s ParametrD time=1234milsec
    Teraz skrypt odpalasz podajac nazwe pliku wejsciowego jako parametr (skrypt.pl plik_wejsciowy) i dostajesz w wyniku pliki Parametr*-hist.csv

    Zakladam ze parametry nazywaja sie dokladnie ParametrA, ParametrB, itd a nie jakos inaczej - po prostu tak bylo mi prosciej :-P ale jakby cos to zmienisz sobie regex. Kod mozna napisac krocej ale celowo zostawiam go tak jak jest. Do zliczania uzywam hasha hashy, czyli hash zawierajacy jako wartosc nastepny hash :-)

    Kod:
    #!/usr/bin/perl
    use strict;
    
    # hash hashy...
    my %wyniki;
    
    # czytamy dane
    open (FH, $ARGV[0]) || die "Nie moge odczytac $ARGV[0]: $!\n";
    while (<FH>) {
    	next if !/\w/;
    	/(Parametr.*?)\s+time=(\d+)/;
    	$wyniki{$1}{$2}++;
    }
    close (FH);
    
    # zrzucamy wyniki do CSV
    foreach my $param (keys %wyniki) {
    	open (OUT, "> $param-hist.out") || die "Nie moge otworzyc $param-hist.csv do zapisu: $!\n";
    	print OUT "CZAS,WYSTAPIENIA\n";
    	foreach my $mils (sort keys %{$wyniki{$param}}) {
    		print OUT "$mils,$wyniki{$param}{$mils}\n";
    	}
    	close OUT;
    }
    Mowiac krotko struktura wynikow jest taka:

    Kod:
    %wyniki = {
              'ParametrB' => {
                               '1234' => 2
                             },
              'ParametrD' => {
                               '1234' => 2
                             },
              'ParametrA' => {
                               '1234' => 1
                             },
              'ParametrC' => {
                               '123' => 1,
                               '1234' => 1
                             }
            };
    Tak wlasnie wyglada hash hashy... i dla zainteresowanych... aby to zobaczyc do kodu wystarczy dodac:

    Kod:
    use Data::Dumper;
    print Dumper \%wyniki;    # celowo \ aby przekazac odwolanie do zmiennej
    Czas pisania z testowaniem <5min... milej zabawy

    EDIT:

    Dane wyjsciowe masz posortowane wg czasow w plikach .CSV wiec wykres machnij sobie w jakims arkuszu kalkulacyjnym. Zwyczajnie nie chce mi sie bawic w rysowanie wykresow w perlu, choc nie jest to trudne...
    Ostatnio edytowane przez TQM : 07-29-2008 - 10:42
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  3. #3

    Domyślnie

    MSSPReplySubscriberServiceParams status: 2023 msg_id:0000000 execution time: 194 millis.

    Dzieki za pomoc... ale chyba temat za bardzo uproscilem... powyżej jest przykładowa linijka log'a, taki log ma 1500 stron, takich linii jest bardzo duzo, powiedz mi jesli mozesz jak zmodyfikowac twoj program zeby mi tylko wybieral execution time i zapisywal do pliku...

    Pozdrawiam.. probowalem kombinowac z twoim podem ale jakos nie wychodzi pojawia mi sie w arkuszu 1 pole z wartoscia

  4. #4
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    nie ma problemu... zmien tylko te 2 czesci

    Kod:
    # czytamy dane
    open (FH, $ARGV[0]) || die "Nie moge odczytac $ARGV[0]: $!\n";
    while (<FH>) {
        next if !/\w/;
        /time:\s+(\d+)\s/;
        $wyniki{$1}++;
    }
    close (FH);
    
    # zrzucamy wyniki do CSV
    open (OUT, "> hist.csv") || die "Nie moge otworzyc hist.csv do zapisu: $!\n";
    print OUT "CZAS,WYSTAPIENIA\n";
    foreach my $param (keys %wyniki) {
        print OUT "$param,$wyniki{$param}\n";
    }
    close OUT;
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  5. #5

    Domyślnie

    Wielkie dzięki za pomoc...

Podobne wątki

  1. Ukrywanie danych w plikach .txt
    By Spec_od_dysków in forum Steganografia
    Odpowiedzi: 14
    Autor: 01-08-2011, 10:26
  2. bindowanie txt z obrazem + odczyt
    By hedVB in forum Newbie - dla początkujących!
    Odpowiedzi: 8
    Autor: 05-22-2008, 21:24
  3. zapisywanie zmiennej z javascript w pliku txt
    By ironwall in forum PHP/CGI/ASP/JSP/J2EE
    Odpowiedzi: 7
    Autor: 10-16-2007, 23:36
  4. [skrypt] - pytanie
    By Error in forum Newbie - dla początkujących!
    Odpowiedzi: 10
    Autor: 12-27-2006, 13:25
  5. Odpowiedzi: 13
    Autor: 07-05-2006, 17:15

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj