I have some log file data stored as long strings of (attribute=value)
pairs. Here is some dummy data representing a few lines:
------------------------------------------------------------
att0=4010&att7=2457&att2=439
att3=902&att2=413&att5=4262&att4=4967
att5=4040&att1=465
att4=2733
att3=2397&att2=1104&att6=2625
------------------------------------------------------------
Each of the (attribute=value) pairs is delimited by "&", and the
attribute name is separated from the value by an "=" character.
Each of the lines can have an arbitrary number of attributes, including
lines with no attributes.
Values can be strings or numbers, necessitating boxed results.
Attributes can appear in any order on a line (i.e. att0 can occur
before/after att1 etc.).
What I want to do is to take the values from certain attributes and put
them into a table, i.e. take the values of att0, att1 and att2 in dummy
data (above) and create the following table.
+----+----+----+
|att0|att1|att2|
+----+----+----+
|4010| |439 |
+----+----+----+
| | |413 |
+----+----+----+
| |465 | |
+----+----+----+
| | | |
+----+----+----+
| | |1104|
+----+----+----+
Below is what I have so far. I cannot figure out the last steps.
NB. Verb to generate dummy data
genattdat=: 3 : 0
NB. y = #lines testdata to generate
numlines=. y
NB. Maximum attributes per line (for demo purposes)
MAXATTS=. 8
MAXVAL=. 5000 NB. Max dummy value
NB. Create attribute list
attrlist=: 'att'&, each cut":i.MAXATTS
res=. ''
for. i.>:y do.
randatts=. (~.(? (?#attrlist) $ (#attrlist))){attrlist
randvals=. ":each <"0 ((#randatts) ?MAXVAL)
res=. res,(<}:;;<"1 randatts,.(<'='),.randvals,.(<'&'))
end.
]res=. >}.res
)
NB. Generate 5 lines of dummy data
]testdata=: genattdat 5
att5=1830
att2=3371&att6=3188&att3=536&att4=1176&att7=1832
att0=1732&att7=4102&att3=797
att6=4278&att1=3480&att2=4333&att5=2933&att7=1160
att1=808&att2=2321&att4=3544&att5=3794
NB. Parsed attributes
]atts=: deb each >{."1 each > each <"1 '='&cut each '&'&cut"1
testdata
+----+----+----+----+----+
|att5| | | | |
+----+----+----+----+----+
|att2|att6|att3|att4|att7|
+----+----+----+----+----+
|att0|att7|att3| | |
+----+----+----+----+----+
|att6|att1|att2|att5|att7|
+----+----+----+----+----+
|att1|att2|att4|att5| |
+----+----+----+----+----+
NB. Parsed values
]vals=: deb each >,@}.@|: each > each <"1 '='&cut each '&'&cut"1
testdata
+----+----+----+----+----+
|1830| | | | |
+----+----+----+----+----+
|3371|3188|536 |1176|1832|
+----+----+----+----+----+
|1732|4102|797 | | |
+----+----+----+----+----+
|4278|3480|4333|2933|1160|
+----+----+----+----+----+
|808 |2321|3544|3794| |
+----+----+----+----+----+
NB. Attributes I want to keep and put into a table
]keepattributes=: 'att'&, each cut":i.3
+----+----+----+
|att0|att1|att2|
+----+----+----+
NB. mask of attributes to keep
]keepmsk=: (#keepattributes)>keepattributes i. atts
0 0 0 0 0
1 0 0 0 0
1 0 0 0 0
0 1 1 0 0
1 1 0 0 0
NB. attributes to keep
]keepatts=: keepmsk #"1 1 atts
+----+----+
| | |
+----+----+
|att2| |
+----+----+
|att0| |
+----+----+
|att1|att2|
+----+----+
|att1|att2|
+----+----+
NB. values to keep
]keepvals=: keepmsk #"1 1 vals
+----+----+
| | |
+----+----+
|3371| |
+----+----+
|1732| |
+----+----+
|3480|4333|
+----+----+
|808 |2321|
+----+----+
It is here that I get stuck. How do I get keepatts and keepvals to this
form?
NB. Hand built result
+----+----+----+
|att0|att1|att2|
+----+----+----+
| | | |
+----+----+----+
| | |3371|
+----+----+----+
|1732| | |
+----+----+----+
| |3480|4333|
+----+----+----+
| |808 |2321|
+----+----+----+
Thanks,
Ken
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm