Pokaż wyniki 1 do 4 z 4

Temat: porównanie 2 plików

  1. #1
    Zarejestrowany
    Oct 2012
    Postów
    7

    Domyślnie porównanie 2 plików

    plik 1 - 25tys pozycji
    plik 2 - 60tys pozycji
    potrzebuje kodu w perlu ktory sprawdzi po kolei (w petli)czy pozycja z pliku1 znajduje sie w pilku2
    w bashu prościzna ale perla nie znam dobrze i nie moge wykombinowac

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

    Domyślnie

    Nie bede pisal gotowca ale podam Ci wskazowki:

    1. Wczytac dowolny z tych plikow do tablicy
    2. dla kazdej linii z drugiego pliku sprawdzic czy jest w tablicy ktora juz zaladowalismy (perldoc grep)
    3. zadanie zaliczone
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  3. #3
    Zarejestrowany
    Oct 2012
    Postów
    7

    Domyślnie

    [QUOTE=TQM;62480]Nie bede pisal gotowca ale podam Ci wskazowki:

    1. Wczytac dowolny z tych plikow do tablicy
    2. dla kazdej linii z drugiego pliku sprawdzic czy jest w tablicy ktora juz zaladowalismy (perldoc grep)
    3. zadanie zaliczone

    wlasnie mam problem z pkt2
    wczytuje plik2 większy do tablicy a z pliku1 chce sprawdzic po pierwszej kolumnie

    Kod:
    open FILE2, "sciezka do pliku";
    open FILE1, "sciezka do pliku";
    while (<FILE1>) {
            my @file2 = split(/;/,$_);
            my @linia =$file2[0];
            }
    my @list=<FILE2>;
    my $string=<@linia>
    my @wynik=grep /$string/,@list;
    print "@wynik";
    close FILE1;
    close FILE2;
    nie wiem jak przekazac argument do grepa (jakby byl konkretny wzorzec do sprawdzenia to zadziala bo tak robilem), ale jak ma podstawiac kolene wiersze w FILE1 to nie dziala...

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

    Domyślnie

    Zacznijmy od tego co robisz zle...

    Kod:
    while (<FILE1>) {
            my @file2 = split(/;/,$_);
            my @linia = $file2[0];  # (1)
            }
    my @list=<FILE2>;
    my $string=<@linia>  # (2)
    my @wynik=grep /$string/,@list;  # nonsens... wynika z 1 i 2
    Omowienie:
    (1) Po pierwsze zmienna jest okreslona jako 'my' wewnatrz petli, wiec nie istnieje poza nia... ba, nawet w kolejnych obrotach petli na poczatku ma wartoc undef a pozniej nadajesz jej wartosc i idziesz dalej - otrzymujesz undef.
    Po drugie w kazdym obrocie petli przypisujesz tablicy wartosc w pierwszym elemencie i nigdy nie dodajesz kolejnych elementow - nawet gdybys okresli zakres zmiennej poza petla to i tak mialbys na koncu jedna wartosc a nie tablice wartosci.

    (2) Czyzbys probowal wczytac do stringu kolejne linie z tablicy?! taka konstrukcja nie ma prawa dzialac - tzn Perl pewnie przyjmie i sprobuje zrobic to o czym Ty myslales (DWIM - Do What I Mean) bo z tego jest znany ale zapewniam Cie ze to co osiagniesz nie bezie tym co chciales osiagnac...

    Proste rozwiazanie:
    Kod:
    #!/usr/bin/perl
    use strict;
    use warnings;
    my @mac;
    open (IN, 'pierwszy_plik.txt');
    while (<IN>) {
      s/^(.*?);/$1/;  #zastap kazda linie tym co jest od poczatku linii do pierwszego srednika
      push @mac, $_;
    }
    close (IN);
    
    # c.d.n.
    Polowe kodu masz, rusz glowa, to nie jest trudne - nie musisz uzywac grep() mozesz uzyc regex'ow - jak wolisz... Typowe dla Perla TIMTOWTDI (There Is More Than One Way To Do It). Pokaz co potrafisz, czekam na kod.
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

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