Keenan, Greg John (Greg)** CTR ** am Donnerstag, 18. August 2005 05.34:
> Hi,
>
> 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+)/;

The (\d{2,7}) (\d{2,6}) part, containing a space, won't mach concatenated 
fields 6 & 7.

> Can someone point me in the right direction please?

The biggest problem might be that you don't know where to split e.g. 
8936445548 in the last line into two numbers, if you know field 6 is between 
2 and 7, and field 7 between 2 and 6 digits long.

The rest of the problem as I understand it is that the layout of fields 6  & 7 
(2166 623 in the 1st, 8936445548 in the last line) are not perceptible 
"locally", but only by looking at the whole line. (I think this is an error of 
the app producing the lines).

So, you have to take in account the whole line to extract fields 6 & 7.

There is for sure a way to do that in a single regex.
Also, consider the use of split in records with field separators (basically, 
here it may be missing at one place).

One basic idea to parse the lines could be:

1. split the line on space into an array.
2. Count the number of entries
3.a) 19 entries: fields 6 & 7 contained separately
3.b) 18 entries: fields 6 & 7 concatenated, handle separately
4. Handle the host field(s) and adjust the array according to the number of 
entries.

>
> Thanks Greg.

joe

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