Pokaż wyniki 1 do 2 z 2

Temat: Tablica dwuwymiarowa w Perl a polecenie PUSH.

  1. #1
    Zarejestrowany
    Feb 2008
    Postów
    1

    Question Tablica dwuwymiarowa w Perl a polecenie PUSH.

    Witam.
    Mam sporo roboty z plikami zawierającymi wyniki pomiarów. W tej chwili jest to przetwarzane w Excelu, co jest stosunkowo długotrwałe. W dużym skrócie:
    Jest kilka plików, zawierających linie z m.in. nazwą parametru i wartością liczbową (zmiennoprzecinkową). Parametrów jest w sumie 20 różnych, z tym, że każdy z nich występuje zmienną ilość razy (od 0 do 10) bo czasem wartość jest niemierzalna, wystąpi błąd, bądź próbek było mniej niż zakładano wcześniej. W efekcie w pliku jest kilkaset linii, które trzeba przetworzyć. Oczywiście każdy parametr osobno. Wypada czasem tak, że ParametrA jest zmierzony 5 razy, ParametrB ma tylko 2 próbki a ParametrC ma próbek 7. Trzeba je zebrać osobno i uśrednić próbki parametru A, B, C itd...
    Proste rozwiązanie widzę tak, że każdy parametr ma swoją tablicę (@parametrA) i przy teście wyrażenia regularnego wrzucam przez PUSH to, co wychodzi w zmiennej $2 (push @parametrA, $2). To działa. Niestety do mnie dotarło, że w ten sposób będę miał 20 pętli obliczających średnią i odchylenie standardowe. Wydaje mi się to bardzo nieeleganckim rozwiązaniem. Idealna byłaby tablica dwuwymiarowa.
    $matrix[0] - parametrA
    $matrix[1] - parametrB itd
    wtedy $matrix[0][0] zawiera pierwszą wartość parametrA, $matrix[0][1] jest drugą wartością parametrA itd.
    $matrix[1][0] zawiera pierwszą wartość parametrB itd.
    Przeliczenie wszystkich 20 parametrów, to były by 2 pętle... Proste, przejrzyste i mało klepania w klawisze.
    Jak to rozwiązać?
    Polecenie PUSH zdaje się nie działać z czymkolwiek innym niż @array co oznacza, że będę musiał mieć 20 liczników dla każdego parametru albo przy obliczaniu, wpierw sprawdzać ile wartości różnych od zera (o ile "Undefined" będzie jako zero odczytane) zawiera dany wiersz tablicy. Jeśli mimo tego da się jakoś użyć PUSH, jak odczytać ilość elementów w tablicy (scalar(@matrix[0]) ?)
    Jak zdefiniować taką tablicę? Może ja źle do tego podszedłem? Dodam, że programuję w Perl od dziś... Wcześniej tylko C/C++.

    Z góry dzięki za pomoc.

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

    Domyślnie

    Jak na kogos kto wlasnie zaczal to masz spore pojecie - gratuluje!

    No to lecimy z tymi pomiarami... ja do pomiarow uzywam RRDtool - samo robi sporo za mnie i ladnie kresli wykresy ale to nie uniwersalne narzedzie... poza tym bez Perl'a byloby z RRD ciezko :P

    Mozesz zbierac dane z pliku i trzymac je w pamieci jako tablice tablic (AoA - array of arrays) czyli $tablica[x][y]=$wartosc albo jako hash tablic czyli $wyniki{$parametr}[y].

    Co do push - dziala tylko na tablicach, zastosowanie na skalarach nie ma sensu a na hashu juz w ogole bo te sa nieuporzadkowane Na podstawie informacji jakie dostarczyles zakladam ze:

    - plik wejsciowy ma w 1 linii iles parametrow zapisanych jako: A=xxx B=yyy C=zzz
    - wartosci sa tylko liczbowe, cokolwiek nieliczbowe traktujemy jako UNDEFINED i pomijamy - nie wliczamy do sredniej z pomiarow - tak jakby pomiar sie nie odbyl, wiec jesli mamy 3 wartosci i 5 undefined to srednia liczymy dla 3 a nie 8 elementow
    - plik zawiera dowolna ilosc pomiarow - 1 w kazdej linii
    - srednia i mediana beda liczone dla calego pliku a nie dla kazdej linii osobno

    Kod:
    #!/usr/bin/perl
    use warnings;
    use strict;
    
    my %wyniki;
    
    open (FH, $ARGV[0]) || die "Can't open input file: $!\n";
    while (<FH>) {
    	chomp;
    	my @data = split(/\s+/);  # dzielimy na pola tam gdzie 1+ bialych znakow
    	foreach (@data) {
    		my ($key, $val) = split(/=/);
    		if ($val != 0 && $val =~ /^\d+(\.\d+)?$/) { [email protected]{$wyniki{$key}}, $val };
    	}
    }
    close (fH);
    Sposob odwolania do tablicy jest prosty - @{$wyniki{'klucz_hasha'}} a do elemetnu jako $$wyniki{parametra}[n] lub ${$wyniki{parametr}}[n]
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

Podobne wątki

  1. Perl-echo.pl-smthg wrong?
    By Efraim in forum Perl/Python/TCL/Prolog
    Odpowiedzi: 12
    Autor: 11-14-2007, 18:03
  2. polecenie GET
    By tommekk in forum Newbie - dla początkujących!
    Odpowiedzi: 14
    Autor: 10-31-2007, 23:15
  3. bot irc PERL
    By jaszu in forum Perl/Python/TCL/Prolog
    Odpowiedzi: 1
    Autor: 08-01-2007, 09:40
  4. Tworzenie katalogow.perl.foreach.
    By riczard_nikson in forum Perl/Python/TCL/Prolog
    Odpowiedzi: 1
    Autor: 01-19-2007, 22:54
  5. Problem z Petla Perl
    By szpuni in forum Perl/Python/TCL/Prolog
    Odpowiedzi: 11
    Autor: 07-03-2006, 16:23

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52