Strona 2 z 2 PierwszyPierwszy 12
Pokaż wyniki 11 do 15 z 15

Temat: problem z wyrazeniem regularnym m/C$/

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

    Domyślnie

    Format definiujesz przed petla, ustawiasz aktywny format (zmienna) i dajesz 'write FILEHANDLE;' i to powinno dzialac. select() nie jest konieczne ale absolutnie nie jest bledem. Jesli jednak uzyjesz select to w ostatniej linii daj 'print STDOUT "tekst";' i bedzie ok, bo inaczej print idzie na uchwyt ktory wybral select() czyli AXEPARAM
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  2. #12

    Domyślnie

    juz pozmienialem i smiga, "Extraction done" szlo do pliku ale juz zmienilem, a wiesz co zrobic z ostatnia linia? chodzi o ten blad.
    jesli chodzi o sortowanie to wiem jak posortowac hash po kluczu (@klucze = sort keys %hash ale jak zrobic hasza tylko z 2 kolumny? bo moj 1 pomysl czyli fieldsort [2],@tab_z_pliku; chyba nie smignie przy 100k linii?

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

    Domyślnie

    Hash nie ma kolumn - hash ma tylko klucz i wartosc...
    Jesli wiesz ze setname jest unikatowe to bardzo prosto mozesz zrobic sortowanie - zamiast pisac do pliku w petli, ladujesz wszystkie linie do hash'a uzywajac $setname jako klucza i calej linii jako wartosci...
    Pozniej sortujesz hash po kluczu i drukujesz do pliku.

    Jesli nie masz pewnosci ze setname bedzie unikalne (hash wymaga unikalnosci bo wartosc jest tylko jedna!) to mozna to zrobic jako hash hashy (czasami oznaczany jako HoH) gdzie wartoscia hash'a jest nastepny hash.

    $dane{$setname}->{$name}=$dodatkowe_pole;

    Wtedy sortujesz %dane po kluczu, pozniej ten hash co w srodku tez po kluczu i masz gotowe wyjscie... w petli lecisz i robisz write do pliku uzywajac formatu.

    100k linii to pestka. Jakbys mial 20mln to bym sie zastanawial ale tak to nie ma tematu. Ja mam okazje dosc czesto mielic pliki po pare GB tak ze juz optymalizujac skrypty proces perla zajmuje 6-7GB RAM (inaczej sie wywala po 4-5h pracy zanim pokaze wyniki) ale tam sa dziesiatki jesli nie setki milionow linii ktore trzeba wyciagnac z paru plikow i zlozyc w jedna calosc...
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  4. #14

    Domyślnie

    Cytat Napisał TQM Zobacz post
    Jesli wiesz ze setname jest unikatowe
    niestety wiem ze nie jest, powtarza sie, czasem nawet kilkadziesiat razy
    Cytat Napisał TQM Zobacz post
    hash wymaga unikalnosci bo wartosc jest tylko jedna!
    rozumiem ze unikalny musi byc klucz, tak? bo wartosci czyli cala linia ani razu sie nie powtorzy...
    Cytat Napisał TQM Zobacz post
    $dane{$setname}->{$name}=$dodatkowe_pole;
    Wtedy sortujesz %dane po kluczu, pozniej ten hash co w srodku tez po kluczu i masz gotowe wyjscie... w petli lecisz i robisz write do pliku uzywajac formatu.
    rozumiem ze tu wartoscia jednego? czy wiecej? hasza ma byc kolejny hasz, ale jak dzieki temu posortuje caly plik

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

    Domyślnie

    Kod:
    #!/usr/bin/perl
    use Data::Dumper;
    
    my %setNames;
    $setNames{SetA}->{name1}='supplier';
    $setNames{SetA}->{name2}='supplier';
    $setNames{SetB}->{name3}='cokolwiek';
    
    print Dumper \%setNames;
    Modul Data:umper jest Twoim przyjacielem... pokazuje co i jak

    Ten samo kod mozna napisac inaczej:
    Kod:
    #!/usr/bin/perl
    use Data::Dumper;
    
    my %SetA = ('name1'=>'supplier', 'name2'=>supplier');
    my %SetB = ('name3'=>'cokolwiek');
    my %setNames = ('SetA' => \%SetA, 'SetB' => \%SetB);
    
    print Dumper \%setNames;
    w ten sposob zagniezdzilem hash'e w hashu... obie wersje sa poprawne i daja ten sam efekt... a znak -> to dereferencja - musisz nieco doczytac...

    Wynik pracy programu jest:
    Kod:
    $VAR1 = {
              'SetB' => {
                          'name3' => 'cokolwiek'
                        },
              'SetA' => {
                          'name2' => 'supplier',
                          'name1' => 'supplier'
                        }
            };
    ... wiec widac zagniezdzenie i dokladnie co jest czym, widac ze to hash hashy itd.

    Sortowanie mozna teraz zrobic tak:
    Kod:
    foreach my $setname (sort keys %setNames) {
      my %dataset = %{$setNames{$setname}});
      foreach my $name (sort keys %dataset) {
        print "$name $setname $dataset{$name}\n";
      }
    }
    oczywiscie print() mozna zastapic write() uzywajac formatow i albo zmienic lekko opis formatu aby uzywalo pol jak wyzej albo zmienic nazwy zmiennych aby pasowaly do tego co juz masz.
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

Strona 2 z 2 PierwszyPierwszy 12

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