columnize
| Definition: | sequence res = columnize(sequence source, object columns={}, object defval=0) |
| Description: | Convert a set of sequences into a set of columns.
Any atoms found in source are treated as if they were a 1-element sequence. The optional columns parameter can be a specific column number or an ordered set. The default value is used when some elements of source have different lengths. Returns a sequence of sequences (or strings), one for each required column. |
| pwa/p2js: | Supported. |
| Comments: |
Can make it much easier to declare related items yet still be able to use a plain find().
To obtain a different view/ordering of the results of columnize, a tagsort is recommended. |
| Example 1: | Perform a standard table inversion or just pick out the desired items |
?columnize({{1, 2}, {3, 4}, {5, 6}}) -- {{1,3,5}, {2,4,6}}
?columnize({{1, 2}, {3, 4}, {5, 6, 7}}) -- {{1,3,5}, {2,4,6}, {0,0,7}}
?columnize({{1}, {2}, {3, 4}},defval:=-999) -- {{1,2,3}, {-999,-999,4}}
?columnize({{1, 2}, {3, 4}, {5, 6, 7}}, 2) -- {{2,4,6}}
?columnize({{1, 2}, {3, 4}, {5, 6, 7}}, {2,1}) -- {{2,4,6}, {1,3,5}}
|
|
| Example 2: | Use a space defval if you want strings back: |
?columnize({"abc", "def", "ghi"},defval:=' ') -- {"adg", "beh", "cfi" }
Otherwise you would actually get {{97'a',100'd',103'g'},{98'b',101'e',104'h'},{99'c',102'f',105'i'}} returned - your program (including printf("%s") etc) should still work, however debugging/ex.err/pp()/? will be harder to decipher. |
|
| Example 3: | Declare logically related items together but generate several separate matching tables, suitable for find() or (perhaps/if strictly in order) binary_search(). |
constant {field,desc,val} = columnize({{"field1", "desc1",5},
{"field2", "desc2",3}})
constant {knowntags, knowntagdescs} = columnize({
{MI_SIGNATURE, "Module info signature"},
{MI_FILENAME, "Record with full path of executable"},
{MI_RTP, "RTP"},
$},{1,2})
-- which is equivalent to:
constant field = {"field1", "field2"},
desc = {"desc1", "desc2"}
val = {5,3}
constant knowntags = {MI_SIGNATURE,MI_FILENAME,MI_RTP},
knowntagdescs = {"Module info signature",
"Record with full path of executable",
"RTP"}
This may save considerable effort when you have hundreds of fields: major chance for mishap as well as eyebrainandcursorfingerache, were it not for columnize(). Also note that plade.exw required (for want of a better term) nested use of columnize; instead of
constant {{iupnames,iuprids}, cem, sigs, icons, ...} = columnize({...})
the desired 5+ matching tables were achieved through
constant {iupnamerids, cem, sigs, icons, ...} = columnize({...})
constant {iupnames,iuprids} = columnize(iupnamerids)
|
|
| Implementation: | See builtins\pcolumn.e (an autoinclude) for details of the actual implementation. |
| See Also: | join, tagset |