Strona 1 z 2 12 OstatniOstatni
Pokaż wyniki 1 do 10 z 15

Temat: problem z wyrazeniem regularnym m/C$/

  1. #1

    Domyślnie problem z wyrazeniem regularnym m/C$/

    hey, wlasnie zaczalem sobie stukac skrypt w perlu, ktory ma mi z jednego pliku do drugiego skopiowac odpowiednie linie i cos jeszcze w nich dopisac, wyglada tak:
    open LOGFILE, "<",'dbtsp12A.log' or die "Cannot open LOG file $!";
    open AXEPARAM, ">",'dbtsp12Anew.txt' or die "Cannot open output file $!";

    # Starting extraction
    print "Extracting script..\n";

    while ($linia = <LOGFILE>) {
    $linia = substr($linia,33);
    if ($linia =~ /OWNS/) {
    $linia = substr($linia,5);
    if ($linia =~ /.*C$/) {
    print AXEPARAM"$linia";
    }
    }
    }
    # Closing files
    close (LOGFILE);
    close (AXEPARAM);

    print "Extracting done.\n";

    to moj 1-szy dzien z perlem wiec prosze o wyrozumialosc
    zupelnie nie rozumiem dlaczego nic nie zapisuje w drugim pliku?! kiedy usuwam warunek ze ma sprawdzic tylko ostatnia litere wiersza dziala i przepisuje wszystkie wiersze ktore zawieraja "C", w momencie ostatniego porownania $linia zawiera mniej wiecej taki wiersz "NAME SETH", czy to ze sa tam 2 slowa stanowi problem dodatkowo przy printowaniu probowalem sobie dopisac w wynikowym pliku jakis strind przy uzyciu "." i nie wiem czemu printuje to co dopisalem w kolejnej linii tez nie wiem czemu (probowalem uzyc chompa i to samo :/)
    czuje ze rozwiazanie jest banalne ale siedze juz kilka godzin i nic :/

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

    Domyślnie

    1. proponuje zobaczyc dokumentacje substr...
    2. regex jest zachlanny...
    Kod:
    if ($linia =~ /.*C$/) {
    .* pochlania C oraz $... powinno byc /.*?C$/ albo po prostu /C$/
    3. brak spacji miedzy nazwa uchwytu a tekstem
    Kod:
    print AXEPARAM"$linia";
    dlatego nic nie zapisuje sie do pliku wyjsciowego...

    poza tym na poczatku proponuje dodac:
    Kod:
    use strict;
    use warnings;
    to spowoduje ze bedziesz musial zadeklarowac zmienne uzywajac 'my' zanimich uzyjesz ale dzieki temu bedziesz wiedzial ze np zmienne sa puste, ze ich nie ma itd bo strict bedzie sie buntowal i nie odpalisz sktryptu...
    warnings za to bedzie mowilo o wszystkich potencjalnych problemach - znacznie ulatwia debug kodu... no i nie wspomne juz o tym, ze sa to dobre praktyki dla kazdej osoby piszacej w Perlu
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  3. #3

    Domyślnie

    witam, dzieki za odpowiedz, teraz moj kod wyglada tak:

    # Opening files
    open LOGFILE, "<",'dbtsp12A.log' or die "Cannot open LOG file $!";
    open AXEPARAM, ">",'dbtsp12Anew.txt' or die "Cannot open output file $!";

    # Starting extraction
    print "Extracting script..\n";

    my $linia = '';
    while ($linia = <LOGFILE>) {
    $linia = substr($linia,33);
    if ($linia =~ /OWNS/) {
    $linia = substr($linia,5);
    if ($linia =~ /C/) {
    print AXEPARAM"$linia"." CUSTOMER";
    }
    }
    }

    # Closing files
    close (LOGFILE);
    close (AXEPARAM);

    print "Extracting done.\n";

    1. nie rozumiem czemu customer zamiast na koncu aktualnej linii dopisywany jest na poczatku kolejnej wiesz czemu sie tak dzieje?
    2. w opstatnim ifie jesli zrobie if ($linia=~ /C$/) czyli chce zeby przepisal i dopisal tylko linie z "C" na koncu linii, nie zapisuje mi w pliku wynikowym NIC!! natomiast w konsoli wyrzuca mi:
    Use of uninitialized value in pattern match (m//) at axe_param.pl line 29, <LOGFILE> line 121627.
    substr outside of string at axe_param.pl line 28, <LOGFILE> line 121628.
    to zapewne dlatego ze w pliku wejsciowym mam tez puste linie. jak to obejsc?

  4. #4

    Domyślnie

    teraz moj kod wyglada tak:
    #!/usr/bin/perl
    use strict;
    use warnings;
    no warnings ('substr', 'uninitialized');

    # Opening files
    open LOGFILE, "<",'dbtsp12A.log' or die "Cannot open LOG file $!";
    open AXEPARAM, ">",'dbtsp12Anew.txt' or die "Cannot open output file $!";

    # Starting extraction
    print "Extracting script..\n";

    my $linia = '';
    while ($linia = <LOGFILE>) {
    $linia = substr($linia,33);
    if ($linia =~ /OWNS/) {
    $linia = substr($linia,5);
    if ($linia =~ /C/) { substr ($linia, 21) = " CUSTOMER\n";
    print AXEPARAM"$linia";}
    elsif ($linia =~ /S/) { substr ($linia, 21) = " SUPPLIER\n";
    print AXEPARAM"$linia";}
    elsif ($linia =~ /F/) { substr ($linia, 21) = " FEAUTURE\n";
    print AXEPARAM"$linia";}
    }
    }

    # Closing files
    close (LOGFILE);
    close (AXEPARAM);

    print "Extracting done.\n";

    niestety nie wiem jeszcze czemu jesli w w.r. w warunku dodam $ na koncu to nie przepisuje nic i jak dopisac odpowiedni 1 z 3 napisow w jednej kolumnie (w kazdym wierszu w tym samym miejscu, substr nie dzaiala wyrzuca ze chce cos dopisac po zakonczeniu stringa)
    cos mi podpowiada ze w ogole zle sie zabralem do wyciagniecia z pliku odpowiednich kolumn...

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

    Domyślnie

    1. wylaczanie warnings dla problemow ktore Ci raportuje bo nie wiesz jak je rozwiazac jest raczej glupim pomyslem... po to jest warnings aby raportowalo co jest nie tak
    2. nadal nie poprawiles kodu piszacego do pliku wyjsciowego - nadal nie dodales spacji i dziwisz sie ze dane sa zle...
    3. logika skryptu jest skopana jak dla mnie... bo jesli linia zawiera C to bierzesz ostatnie 21 znakow z wiersza i przepisujesz do nowego pliku i doklejasz "CUSTOMER"...

    No wiec to nie ma prawa dzialac, bo kazda linia w pliku ma znak nowej linii i Twoje CUSTOMER pojawi sie w nastepnej (osobnej) linii a do tego powinno brakowac Ci jednego znaku z tekstu ktory chcesz wyciagnac bo znak nowej linii tez jest dopasowywany jako znak.

    Chcesz pomocy to pokaz dane wejsciowe i przyklad danych wyjsciowych bo na razie pytasz dlaczego kod w ktorym sa oczywiste bledy (ktorych nie naprawiles) nadal nie dziala.
    Ostatnio edytowane przez markossx : 02-13-2012 - 17:14
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  6. #6

    Domyślnie

    moj kod:
    #!/usr/bin/perl
    use strict;
    use warnings;

    # Opening files
    open LOGFILE, "<",'dbtsp12A.log' or die "Cannot open LOG file $!";
    open AXEPARAM, ">",'dbtsp12Anew.txt' or die "Cannot open output file $!";

    # Starting extraction
    print "Extracting script..\n";
    print AXEPARAM "Name Setname Class\n";
    my $linia = '';
    while ($linia = <LOGFILE>) {
    if ($linia =~ /OWNS /) {
    $linia = substr ($linia, 38);
    print AXEPARAM "$linia";
    }
    }

    # Closing files
    close (LOGFILE);
    close (AXEPARAM);


    print "Extracting done.\n";

    w pliku wyjsciowym mam cos takiego:
    Name Setname Class
    M2M1 HRC
    HLE1 SLAF
    i o to mi wlasnie chodzi tylko teraz jeszcze w zaleznosci od tego czy setname konczy sie na C czy F w kolumnie Class musze dopisac odpowiedznie slowo.

    po odcieciu tego stringa musze sprawdzic ostatnia jego litere i w zaleznosci od niej dopisac slowo do danej linii ale musi sie zaczynac na tym samym znaku w kazdej linii

    ImageShack&#174; - Online Photo and Video Hosting

    tu sa pliki: wejsciowy i wyjsciowy... widac co chce wyciagnac, tylko jeszcze musze dopisac co trzeba i powinno byc ok.
    Ostatnio edytowane przez Mad_Dud : 02-13-2012 - 14:33

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

    Domyślnie

    A moze tak?
    Kod:
    #!/usr/bin/perl
    use strict;
    use warnings;
    
    my %dodatki = ('C' => 'CUSTOMER', 'S' => 'SUPPLIER', 'F' => 'FEATURE');
    
    # Opening files
    open LOGFILE, "<",'dbtsp12A.log' or die "Cannot open LOG file $!";
    open AXEPARAM, ">",'dbtsp12Anew.txt' or die "Cannot open output file $!";
    
    # Starting extraction
    print "Extracting script..\n";
    print AXEPARAM "Name Setname Class\n";
    while (chomp(my $linia = <LOGFILE>)) {
      # dopasowujemy OWNS <cos> <cos>
      if ($linia =~ /OWNS\s+(\S+)\s+(\S+)/;
        # dopasowane elementy sa w $1 i $2
        my ($name, $setname) = ($1, $2);
        # sprawdzamy jaka jest ostatnia litera $setname
        $setname =~ /(.)$/;
        print AXEPARAM "$name $setname $dodatki{$1}\n";
      }
    }
    
    # Closing files
    close (LOGFILE);
    close (AXEPARAM);
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  8. #8

    Domyślnie

    witam,
    dzieki za pomoc,program oczywoscie dziala tak jak powinien, z tym ze zapisuje do pliku wynikowego oddzielajac wyrazy od siebie tylko spacja, a musza byc w kolumnach rowniutko tak jak w zdjeciu ktore wrzucilem. mam nadzieje ze da sie cos takiego zrobic. dodatkowo jeszcze sie zastanawiam czy da sie posortowac wiersze ale tylko po setname? mam troche wiecej pracy dzis wiec dopiero po poludniu bede mogl usiasc i cos w tym podlubac

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

    Domyślnie

    Oczywiscie ze sie da w kolumny... pare linijek przerobki i bedzie...
    Pelen opis co i jak jest tutaj format - perldoc.perl.org

    Sortowanie tez da sie zrobic dodajac hash z odpowiednimi kluczami a pozniej sortowac po kluczach i pisac do pliku wynikowego, wiec cale dane beda zaladowane do RAM, obriobione i wyplute do pliku.
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  10. #10

    Domyślnie

    zrobilem tak, zapewne powinienem wywalic z petli format i te inne rzeczy, tak?
    Kod:
    #!/usr/bin/perl
    use strict;
    use warnings;
    
    my %dodatki = ('C' => 'CUSTOMER', 'S' => 'SUPPLIER', 'F' => 'FEATURE');
    
    # Opening files
    open LOGFILE, "<",'dbtsp12A.log' or die "Cannot open LOG file $!";
    open AXEPARAM, ">",'dbtsp12Anew.txt' or die "Cannot open output file $!";
    
    # Starting extraction
    print "Extracting script..\n";
    print AXEPARAM "Name              Setname         Class\n";
    
    while (chomp(my $linia = <LOGFILE>)) {
    	if ($linia =~ /OWNS\s+(\S+)\s+(\S+)/) {		# dopasowujemy OWNS <cos> <cos>
    		my ($name, $setname) = ($1, $2);	# dopasowane elementy sa w $1 i $2
    		$setname =~ /(.)$/;			# sprawdzamy jaka jest ostatnia litera $setname
    		format wyjscie =			# ustalamy format danych w pliku wyjsciowym
    @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<< @<<<<<<<<<<
    $name,            $setname,       $dodatki{$1}
    .
    		select (AXEPARAM);
    		$~ = 'wyjscie';
    		write AXEPARAM;
    	}
    }
    print "Extracting done.\n";
    # Closing files
    close (LOGFILE);
    close (AXEPARAM);
    teraz dziala super tylko jest problem z ostatnia linia pliku, skrypt nie konczy dzialania wypisujac:Extracting done tylko wywala uninitialized value in chomp at moj.pl line 16, <LOGFILE> line 121629. (to jest ostatnia linia mojego pliku) wywala pewnie dlatego ze jest pusta.
    biore sie za sortowanie ale przyznam ze nie mam pomyslu, moze dlatego ze prawie nic nie wiem o haszach, jesli masz jakies wskazowki bede wdzieczny

Strona 1 z 2 12 OstatniOstatni

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