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


Reply via email to