Professional Web Applications Themes

Choosing only numbers from the output - PERL Beginners

Hi I have an output which looks like this: Tag : Result 146603 : 147020 : 147155 : NONE 147160 : 147232 : 147243 : 147254 : none 147318 : 147341 : NONE 147430 : N/A 147708 : 147710 : 0000 147729 : 147768 : 147851 : 147921 : 147949 : 0000 147981 : 147983 : 147991 : 148007 : 0000 148080 : 148105: 148200 : 148312 : 38160 148329 : 44139 148444 :NONE 148514 : 148573 : 0000 148697 : 148759 : 148919 : 148920 : 148921 : 148923 : 148924 : 148933 : 148934 : 148935 : 148936 ...

  1. #1

    Default Choosing only numbers from the output


    Hi

    I have an output which looks like this:

    Tag : Result
    146603 :
    147020 :
    147155 : NONE
    147160 :
    147232 :
    147243 :
    147254 : none
    147318 :
    147341 : NONE
    147430 : N/A
    147708 :
    147710 : 0000
    147729 :
    147768 :
    147851 :
    147921 :
    147949 : 0000
    147981 :
    147983 :
    147991 :
    148007 : 0000
    148080 :
    148105:
    148200 :
    148312 : 38160
    148329 : 44139
    148444 :NONE
    148514 :
    148573 : 0000
    148697 :
    148759 :
    148919 :
    148920 :
    148921 :
    148923 :
    148924 :
    148933 :
    148934 :
    148935 :
    148936 :
    148937 :
    148938 :
    148939 :
    148951 :
    148996 :

    Now i want to gather all the "Tags" for which the "Result" is a number (but shouldnt include the tag if the result is 0). The corresponding Result should go to another array.

    Considering the above example my array1 should contain 148312 and 148329 and array2 should contain 38160 and 44139

    How do i do this?

    Thanks in advance

    Regards
    Sudhindra














    Sudhindra Guest

  2. #2

    Default Re: Choosing only numbers from the output

    Sudhindra K S wrote: 

    Do you possibly mean input? ;-)
     

    <similar lines snipped>
     

    while (<DATA>) {
    my ($tag, $result) = split /[ :]+/;
    if ($result =~ /^\d+$/ and $result > 0) {
    ...

    --
    Gunnar Hjalmarsson
    Email: http://www.gunnar.cc/cgi-bin/contact.pl



    Gunnar Guest

  3. #3

    Default Re: Choosing only numbers from the output

    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1

    sudhindra k s wrote:
    |
    | Hi

    Hello,

    | I have an output which looks like this:
    |
    | Tag : Result
    | 146603 :
    | 147020 :
    | 147155 : NONE
    | 147160 :
    | 147232 :
    | 147243 :
    | 147254 : none
    | 147318 :
    | 147341 : NONE
    | 147430 : N/A
    | 147708 :
    | 147710 : 0000
    | 147729 :
    | 147768 :
    | 147851 :
    | 147921 :
    | 147949 : 0000
    | 147981 :
    | 147983 :
    | 147991 :
    | 148007 : 0000
    | 148080 :
    | 148105 :
    | 148200 :
    | 148312 : 38160
    | 148329 : 44139
    | 148444 : NONE
    | 148514 :
    | 148573 : 0000
    | 148697 :
    | 148759 :
    | 148919 :
    | 148920 :
    | 148921 :
    | 148923 :
    | 148924 :
    | 148933 :
    | 148934 :
    | 148935 :
    | 148936 :
    | 148937 :
    | 148938 :
    | 148939 :
    | 148951 :
    | 148996 :
    |
    | Now i want to gather all the "Tags" for which the "Result" is a number (but shouldnt include the tag if the result is 0). The corresponding Result should go to another array.
    |
    | Considering the above example my array1 should contain 148312 and 148329 and array2 should contain 38160 and 44139
    |
    | How do i do this?

    I would use an array of arrays or an array of hashes instead of two
    separate arrays.


    my tag_and_results;
    while ( <FILE> ) {
    ~ next unless /^(\d+)\D+([1-9]\d*)/;
    ~ push tag_and_results, [ $1, $2 ];
    ~ }




    John
    - --
    use Perl;
    program
    fulfillment
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.2.4 (GNU/Linux)
    Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

    iD8DBQFBEMgW5dGfmBZ1ssARAmiKAJ43Qy6ysZoUR/GURjurXf4FMlVNCACfSn/J
    VQZ4Wxrgr9T6J7zbLXJDOPM=
    =C2SM
    -----END PGP SIGNATURE-----
    John Guest

  4. #4

    Default RE: Choosing only numbers from the output

    One way would be to split each line using : as the delimiter..

    I am sure there are others, but I think split would be the easiest... IMHO



    From: sudhindra k s
    Sent: Wed 8/4/2004 5:48 AM
    To: org
    Subject: Choosing only numbers from the output



    Hi

    I have an output which looks like this:

    Tag : Result
    146603 :
    147020 :
    147155 : NONE
    147160 :
    147232 :
    147243 :
    147254 : none
    147318 :
    147341 : NONE
    147430 : N/A
    147708 :
    147710 : 0000
    147729 :
    147768 :
    147851 :
    147921 :
    147949 : 0000
    147981 :
    147983 :
    147991 :
    148007 : 0000
    148080 :
    148105 :
    148200 :
    148312 : 38160
    148329 : 44139
    148444 : NONE
    148514 :
    148573 : 0000
    148697 :
    148759 :
    148919 :
    148920 :
    148921 :
    148923 :
    148924 :
    148933 :
    148934 :
    148935 :
    148936 :
    148937 :
    148938 :
    148939 :
    148951 :
    148996 :

    Now i want to gather all the "Tags" for which the "Result" is a number (butshouldnt include the tag if the result is 0). The corresponding Result should go to another array.

    Considering the above example my array1 should contain 148312 and 148329 and array2 should contain 38160 and 44139

    How do i do this?

    Thanks in advance

    Regards
    Sudhindra

    Ronald Guest

  5. #5

    Default Re: Choosing only numbers from the output

    I think a hash is more apt for this problem, but changing to (an) array(s)
    is not difficult at all.

    The data as posted had white space trailing some of the digits after the
    colons. I found this worked better for me. Your results may vary.
    ;-)

    #!/usr/bin/perl
    use warnings;
    use strict;

    my %tag;

    while (<DATA>) {
    /^(\d+)\s*:\s*(\d+)/ or next;
    $tag { $1 } = $2 unless $2 =~ /^0+$/;
    }
    while ( my($k, $v) = each %tag ) { print "$k ==> $v\n"; }

    __DATA__
    146603 :
    147020 :
    147155 : NONE
    ..
    ..
    ..


    "Gunnar Hjalmarsson" <cc> wrote in message
    news:perl.org...
     


    Zeus Guest

  6. #6

    Default Re: Choosing only numbers from the output

    Zeus Odin wrote: 
    >
    > The data as posted had white space trailing some of the digits
    > after the colons.[/ref]

    Yes, but how would that matter? Please read the second sentence in
    "perldoc -f split".

    --
    Gunnar Hjalmarsson
    Email: http://www.gunnar.cc/cgi-bin/contact.pl
    Gunnar Guest

  7. #7

    Default Re: Choosing only numbers from the output

    You are correct. I did not properly look at the regex you passed to split.

    "Gunnar Hjalmarsson" <cc> wrote 
    >
    > Yes, but how would that matter? Please read the second sentence in
    > "perldoc -f split".[/ref]


    Zeus Guest

  8. #8

    Default Re: Choosing only numbers from the output

    this is an interesting question in that its not about syntax or a specific
    problem in perl.

    here's the algorithm:

    while there are lines to read from the input
    read a line
    split the line into two seperate strings around the colon
    if both strings are numbers
    append the first string into array1
    append the second string into array2

    that is "how you do this", or at least one way...=)

    sudhindra k s wrote:
     


    Christopher Guest

Similar Threads

  1. Replies: 1
    Last Post: October 10th, 06:11 PM
  2. Numbers not acting like numbers
    By D'Anne in forum PERL Miscellaneous
    Replies: 3
    Last Post: October 2nd, 09:18 AM
  3. Finding Numbers in between two numbers
    By Balaji in forum Microsoft SQL / MS SQL Server
    Replies: 3
    Last Post: July 30th, 07:36 PM

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139