-----Original Message----- From: John W. Krahn [mailto:[EMAIL PROTECTED] Sent: Friday, 19 August 2005 10:26 AM To: Perl Beginners Subject: Re: regex - no field seperator
Keenan, Greg John (Greg)** CTR ** wrote: >>From: Wagner, David --- Senior Programmer Analyst --- WGO >> >>Keenan, Greg John (Greg)** CTR ** wrote: >>> >>>I have the following data that I'm trying to parse into an array. >>>There are 19 fields but with hosts 5 & 6 fields 6 & 7 do not have any >>>space between them. This is how I get it from the OS and have no >>>control over it. >>> >>>The maximum length for field 6 is 7 chars and field 7 is 6 chars. >>> >>>200508171648 host1.dom.com 0 0 14 2166 623 8 4 12 0 0 0 35 131 14 0 0 >>>100 >>>200508171648 host2.dom.com 0 0 0 265 7563 5 3 8 0 0 0 34 66 7 0 0 100 >>>200508171648 host3.dom.com 0 0 0 461 8112 4 0 6 0 0 0 53 84 9 0 0 100 >>>200508171648 host4.dom.com 0 0 0 46 9468 5 3 9 0 0 0 39 75 8 0 2 98 >>>200508171648 host5.dom.com 0 1 0 7008342480 3 0 0 0 0 0 0 41 8 0 2 98 >>>200508171648 host6.dom.com 0 1 0 8936445548 3 0 0 0 0 0 0 14 5 0 0 >>>100 >>> >>>I have tried the following, and several other combos, with no luck. >>>It matches the first 4 lines but fails for the last 2 because they >>>appear to have only 18 fields I assume. >>>@oput = /(\d+) (.+\..+\..+) (\d+) (\d+) (\d+) (\d{2,7}) (\d{2,6}) >>>(\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) >>>(\d+)/; >>> >> You are working much too hard to capture the data. Use split like: >> >> @oput = split (/\s+/,$_); >>You say it is a total of 13 characters, but in this case you have 10 >>characters. How do you identify which field is full? Once you do that >>then >the ability to get it can be done. But you have to first >>identify how to know out say in this case the 10 chaacters what the >>proper split is? > > Fields 6 & 7 could be a minimum of 2 chars or 7 & 6 chars respectively > but the only time fields 6 & 7 merge is if field 7 has reached its > maximum length of 6 chars. Well then, that should be easy enough. :-) while ( <FILE> ) { my @oput = split; if ( @oput == 18 ) { splice @oput, 5, 1, $oput[ 5 ] =~ /(.+)(.{6})/; } elsif ( @oput != 19 ) { warn "Error in $file line $. - wrong number of input fields.\n"; next; } do_something_with( @oput ); } Thanks to David & John for their excellent solutions. I've learnt a little bit more about perl & regexs over the last few days. -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>