a couple of reasons to prefer Raul's approach, beside the simpler validation:
1. you get to prefix the "fields" with the "table name" (;:'a 1.1 b') 'col' masgn i.3 3 0 1 2 3 4 5 6 7 8 2. You can use nl based code for group operations on the fields 'col' nl '' ┌──────┬────┬────┐ │col1_1│cola│colb│ └──────┴────┴────┘ (] ,. ". each ) 'col' nl '' ┌──────┬─────┐ │col1_1│3 4 5│ ├──────┼─────┤ │cola │0 1 2│ ├──────┼─────┤ │colb │6 7 8│ └──────┴─────┘ ----- Original Message ----- From: Ric Sherlock <[email protected]> To: Programming JForum <[email protected]> Cc: Sent: Monday, May 26, 2014 7:08:40 AM Subject: Re: [Jprogramming] Multiple assignments Here is my solution based on the discussion. I don't think that I'd want to prefix the header names normally. For me a lot of the benefit of assigning the columns to the header is that my code becomes more readable. This get spoilt a bit when all the names have prefixes. However assign2hdr takes an optional left arg of the header names, so if you wanted to add a prefix then that is possible at that point. The solution below doesn't yet handle the problem with header names colliding with local names that spawned this thread. forceLeadingAlpha=: ,~ 'X' {.~ [: -.@e.&Alpha_j_ {. replaceNonAlpha=: (-.@e.&AlphaNum_j_)`(,:&'_')} deus=: #~ (+. (1: |. (> </\)))@('_'&~:) NB. delete extraneous underscores coerce2Name=: deus@replaceNonAlpha@forceLeadingAlpha@deb assign2hdr=: 3 : 0 'hdr dat'=. split y hdr assign2hdr dat : hdr=. uniqify_pdsv_ coerce2Name_pdsv_&.> x dat=. |: makenumcol y idx=. I. 2 ~: (3!:0)&> {."1 dat ((<<<idx){hdr)=: <"1 (<<<idx) { dat (idx{hdr)=: idx { dat EMPTY ) On Mon, May 26, 2014 at 8:55 PM, Raul Miller <[email protected]> wrote: > That sounds like a good idea. > > Except I think we need three parameters: > list of names > disambiguating prefix > list of values > > I think I'd like the list of names be x, the prefix be adverb argument and > the list of values be y. > > So here's an implementation: > masgn=:1 :0 > : > bad=.a.-.;'0Aa' ([ (+ i.) 1 + -~)&.(a.&i.)&.> '9Zz' > names=. ('_' I.@e.&bad@]} m&,)&.>x > (names [erase 'names bad x y')=: y > ) > > Example use: > > (;:'a 1.1 b') 'z' masgn i.3 3 > 0 1 2 > 3 4 5 > 6 7 8 > za > 0 1 2 > z1_1 > 3 4 5 > zb > 6 7 8 > > Of course I probably went a little overboard here with the implementation. > So feel free to strip out parts you don't need. And maybe add a 0 0$ at the > beginning of the result line, if you do not like results. > > Thanks, > > -- > Raul > > > > On Mon, May 26, 2014 at 4:39 AM, 'Pascal Jasmin' via Programming < > [email protected]> wrote: > > > The way I would do it would be to add a prefix passed from x parameter, > > and replace spaces (or illegal characters ') with underscores. Assuming > > other illegal characters are rare should be fine, but the advantage of > > prefixing all columns helps both in preventing collisions with general J > > names, and allows processing multiple such files without collision. > > > > > > ----- Original Message ----- > > From: Ric Sherlock <[email protected]> > > To: Programming JForum <[email protected]> > > Cc: > > Sent: Sunday, May 25, 2014 4:20:16 PM > > Subject: Re: [Jprogramming] Multiple assignments > > > > I recently released an update to addons/dsv that contains a new utitlity: > > assign2hdr > > > > testcsv=: noun define > > # The following is an example of a comma-separated file with > > # comment lines at the start of the file indicated by the fact they > > > > # start with the # symbol. > > > > id,bar code,name > > > > 24582621,119533,DELTOP DAVINCI > > > > 25422991,155439,AMBZED ROSCOE S2F > > > > 25784612,135624,TEF SHADOW BLARIS > > > > 22063188,102545,BIG P BLONDEL PRIM > > > > 20803506,137609,MONGA FLOL > > > > 27360900,107865,FRAMBIN R NOGN ET > > > > ) > > > > > > fixcsv testcsv > > > > +--------+--------+------------------+ > > > > |id |bar code|name | > > > > +--------+--------+------------------+ > > > > |24582621|119533 |DELTOP DAVINCI | > > > > +--------+--------+------------------+ > > > > |25422991|155439 |AMBZED ROSCOE S2F | > > > > +--------+--------+------------------+ > > > > |25784612|135624 |TEF SHADOW BLARIS | > > > > +--------+--------+------------------+ > > > > |22063188|102545 |BIG P BLONDEL PRIM| > > > > +--------+--------+------------------+ > > > > |20803506|137609 |MONGA FLOL | > > > > +--------+--------+------------------+ > > > > |27360900|107865 |FRAMBIN R NOGN ET | > > > > +--------+--------+------------------+ > > > > > > assign2hdr fixcsv testcsv > > > > bar_code > > > > 119533 155439 135624 102545 137609 107865 > > > > > > It does try to automatically coerce names, but does so by removing > leading > > blanks and any leading chars that aren't valid starting chars for a name. > > Adding as 'X' in front may be better than that. > > > > On May 26, 2014 5:04 AM, "Devon McCormick" <[email protected]> wrote: > > > > > Assigning column names this way can be very useful. However, it > requires > > > that column names be valid J variable names. The R programming > language > > > has a feature like this that includes automatic coercion of invalid > names > > > for at least a couple of simple cases - something like changing > embedded > > > spaces to underscores and prefixing any name beginning with a numeral > > with > > > "X". > > > > > > It might be useful to publicize a simple set of conversions like this > > for J > > > names on the wiki so that there's at least a stab at standardization. > > > > > > > > > On Sun, May 25, 2014 at 12:58 PM, J. Patrick Harrington > > > <[email protected]>wrote: > > > > > > > I've always liked this economy of assignment: > > > > 'e f g'=. s=. >1 2;3 4;5 6 > > > > f > > > > 3 4 > > > > e > > > > 1 2 > > > > -- but I wondered if it were possible to extend this where the left > > hand > > > > side is not explicit: > > > > abc=. 'a';'bb';'ccc' > > > > ┌─┬──┬───┐ > > > > │a│bb│ccc│ > > > > └─┴──┴───┘ > > > > I found I could make a single assignment: > > > > (>1{abc)=. 1{s > > > > bb > > > > 3 4 > > > > a > > > > |value error: a > > > > But I didn't want to put this into a loop. > > > > It was neat to find that I could write: > > > > (abc)=. s > > > > a > > > > 1 2 > > > > bb > > > > 3 4 > > > > ccc > > > > 4 5 > > > > abc > > > > ┌─┬──┬───┐ > > > > │a│bb│ccc│ > > > > └─┴──┴───┘ > > > > This is useful in working with data files output > > > > by a stellar evolution program where I have ASCII tables with 90 > > columns > > > > and over 1000 rows, and each > > > > column has a name 1 to 25 characters long: I wanted > > > > to read this into a J session, assigning the column > > > > values to each of the respective names. Turns out it > > > > can be done with one line of the form > > > > (head)=: data_array > > > > where > > > > head > > > > ┌────┬────┬──────┬────┬────┬──────────┬────────┬──────────── > > > > ─────────────┬───────────────────┬─ > > > > │zone│logT│logRho│logP│logR│luminosity│eps_grav│log_abs_ > > > > eps_grav_dm_div_L│signed_log_eps_grav│.. > > > > └────┴────┴──────┴────┴────┴──────────┴────────┴──────────── > > > > ─────────────┴───────────────────┴─ > > > > (see http://www.astro.umd.edu/~jph/mesa_read.ijs) Another example of > > the > > > > "black hole of J". > > > > > > > > I don't know where in the documentation this can be > > > > found - I just got there by experimentation. > > > > > > > > Patrick > > > > > > > > P.S. This started as a post asking for > > > > help in getting rid of a loop, but > > > > I found the solution along the way. > > > > > ---------------------------------------------------------------------- > > > > For information about J forums see > http://www.jsoftware.com/forums.htm > > > > > > > > > > > > > > > -- > > > Devon McCormick, CFA > > > > > > > > > ---------------------------------------------------------------------- > > > For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm > > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
