For Programmers: Free Programming Magazines  


Home > Archive > PERL Beginners > August 2004 > Choosing only numbers from the output









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Choosing only numbers from the output
Sudhindra K S

2004-08-04, 8:58 am

_
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














Gunnar Hjalmarsson

2004-08-04, 8:58 am

Sudhindra K S wrote:
> I have an output which looks like this:


Do you possibly mean input? ;-)

> Tag : Result
> 148200 :
> 148312 : 38160
> 148329 : 44139
> 148444 : NONE
> 148514 :
> 148573 : 0000
> 148697 :


<similar lines snipped>

> 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?


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

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



John W. Krahn

2004-08-04, 8:58 am

-----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

iD8DBQFBEMgW5dGfmBZ1ssARAmiKAJ43Qy6ysZoU
R/GURjurXf4FMlVNCACfSn/J
VQZ4Wxrgr9T6J7zbLXJDOPM=
=C2SM
-----END PGP SIGNATURE-----
Ronald Yacketta

2004-08-04, 8:58 am

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: beginners@perl.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

Zeus Odin

2004-08-04, 3:56 pm

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" <noreply@gunnar.cc> wrote in message
news:20040804101403.16584.qmail@onion.perl.org...

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



Gunnar Hjalmarsson

2004-08-04, 8:55 pm

Zeus Odin wrote:
> Gunnar Hjalmarsson wrote:
>
> The data as posted had white space trailing some of the digits
> after the colons.


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
Zeus Odin

2004-08-04, 8:55 pm

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

"Gunnar Hjalmarsson" <noreply@gunnar.cc> wrote
>
> Yes, but how would that matter? Please read the second sentence in
> "perldoc -f split".



Christopher J. Bottaro

2004-08-04, 8:55 pm

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:

>
> 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



Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com