Pokaż wyniki 1 do 10 z 10

Temat: [PERL]dopisanie zer do wierszo w w pliku

  1. #1
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie [PERL]dopisanie zer do wierszo w w pliku

    Mam plik liczby.txt, w ktorych znajduja sie liczby. Wiersze sa roznej dlugosci, dlatego tez chcialabym te krotsze wypelnic zerami.

    Probowalam pokobinowac w ten sposob:

    Kod:
    open (W, '>>liczby.txt'); while (<W>) {
      $line=$_;
      print $line ;
     $row=$row+1;
    
     foreach (@col){     #@col jest to wczesniej zdefiniowana tablica z ilosciami kolumn w pliku
        if ($_<$max){     
          $diff=$max-$_;
       $line=$line." 0 " x $diff ;
        }
     }
    
    close(W);
    print "ilos linii $row \n";
    
     }
    close(W);
    Czy moglibyscie mnie naprowadzic jak to zrobic?

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

    Domyślnie

    1. otwierasz plik wejsciowy do odczytu
    2. otwierasz plik wyjsciowy do zapisu
    3. w petli czytasz z pliku wejsciowego
    4. uzywasz funkcji printf() z odpowiednim formatem i liczba pobrana z pierwszego pliku, piszac wynik do pliku wyjsciowego - calosc to jest 1 linia doslownie
    5. petla sie skonczyla, zamykasz oba pliki, konczysz program

    wszystko o formatach znajdziesz w opisie perlowej funckji printf() - prosciej sie nie da
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  3. #3
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    ok, znalazlam taki prosty przyklad:
    my $num = "123";
    $num = sprintf("%5d", $num);
    $num=~ tr/ /0/;

    Jednakze nie wiem, jak w moim przykladzie zrobić, by dla kazdego wiersza wyswietlalo odpowiednia wartosc np. "%?d", gdy ? to jest maksymalna ilosc kolumn, czyli $max.
    Ostatnio edytowane przez Gosik : 11-10-2012 - 21:21

  4. #4
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Cytat Napisał Gosik Zobacz post
    ok, znalazlam taki prosty przyklad:
    my $num = "123";
    $num = sprintf("%5d", $num);
    $num=~ tr/ /0/;

    Jednakze nie wiem, jak w moim przykladzie zrobić, by dla kazdego wiersza wyswietlalo odpowiednia wartosc np. "%?d", gdy ? to jest maksymalna ilosc kolumn, czyli $max.
    Dobra, z tym juz sobie poradzilam, bylo to banalne, ale nie wiem jak zrobic, by zera byly dopisywane na koniec linii, a nie na poczatku.
    Bede wdzieczna za wskazowki.

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

    Domyślnie

    czekaj czekaj... jak dopiszesz zera na koncu liczby to zmieniasz jej wartosc - na pewno tego chcesz?

    Kod:
    $var = sprintf("%05d", $liczba);  # uzupenial zerami z przodu do 5 cyfr
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  6. #6
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Cytat Napisał TQM Zobacz post
    czekaj czekaj... jak dopiszesz zera na koncu liczby to zmieniasz jej wartosc - na pewno tego chcesz?

    Kod:
    $var = sprintf("%05d", $liczba);  # uzupenial zerami z przodu do 5 cyfr

    Daze do tego, aby wczytac do zmiennej $num odpowiedni wiersz z liczbami np.:
    2 33 56 77
    i chcialabym dopisac do niego zera odzielone spacja.

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

    Domyślnie

    Wiesz co nie obraz sie ale jakie pytania taka odpowiedz - ja nie mam zielonego pojecia co Ty chcesz zrobic. Dopisac zera oddzielone spacjami gdzie?!
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  8. #8
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Cytat Napisał TQM Zobacz post
    Wiesz co nie obraz sie ale jakie pytania taka odpowiedz - ja nie mam zielonego pojecia co Ty chcesz zrobic. Dopisac zera oddzielone spacjami gdzie?!
    To moze od poczatku. Mam plik z danymi:
    1 3 4 56 7
    2 5
    3 3 34 3

    Chce wczytac poszczególne wiersze i dopisac do nich zera, tak aby wszystkie wiersze mialy tyle samo liczb (tablica m x n). Ma to wygladac w nastepujacy sposob:
    1 3 4 56 7
    2 5 0 0 0
    3 3 34 3 0

    Czy teraz to jest jasne, co chce zrobic?

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

    Domyślnie

    Teraz jak najbardziej tak :-)

    Nie chce za bardzo podawac gotowca bo chodzi o to aby sie czegos nauczyc ale ja napisalbym to tak:

    1. wczytuje po kolei wiersze z pliku wejsciowego
    2. przerabiasz wiersz na tablice z liczbami i liczysz elementy, zapisujesz najwieksza znaleziona wartosc
    3. konczysz czytac plik i masz ile max kolumn bylo w danych
    4. czytasz plik jeszcze raz tym razem dzielac wiersz na tablice liczb
    5. majac tablice dopelniasz jej dlugosc do max(N) elementow (N z kroku 2)
    6. wypisujesz tablice do pliku wyjsciowego laczac elementy za pomoca spacji


    kod mozna napisac w pare linijek w sumie - ten powyzej zaklada ze nie wiesz ile tych elementow jest - skrypt sam znajdzie i sie dopasuje do sytuacji.

    EDIT:
    Celowo robie 2 przebiegi czytania - pierwszy dla rozpoznania sytuacji a drugi dla wykonania pracy. Mozna tez zrobic 1 przebieg czytania i zaladowac caly plik do RAM ale jesli plik bedzie duzy to program moze sie wysypac i nigdy nie skonczyc pracy - dlatego ja wole 2x czytac zamiast nie wykonac zadania (choc to bylby skrajny przypadek - bez problemu przetwarzalem w pamieci pliki po 2-3GB, choc fajerwerkow nie bylo).
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  10. #10
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Świetnie! Wszystko poszlo tak jak powinno! :-)
    W moim pierwotnym mysleniu zle wykonywalam pkt.4, ale teraz czaje jak to sie robi.
    Wielkie dzieki za pomoc!!!

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