I am trying to compare values in a column of CSV data loaded from a 
file against a set of selected values in order to choose records with 
matching values to be set aside for writing into another file.  Easy 
task, I thought.

However, the first problem I ran into was that there must be things 
about the "select" control structure that are not described anywhere, 
because, for use in matching literals, it would not work, no matter 
what I tried.  So I decided to use the "if" control structure as a 
substitute for the "select" control structure.  And that's when I found 
that literal comparison expressions didn't necessarily work the way I 
intuitively thought.

That second problem was that I forgot that one cannot use "=" as a 
Boolean comparison verb for literals (except for single characters).  
So I had to look up Dan Bron's and Roger Hui's comparison verbs for any 
kind of matching.  For "=", I used Roger's verb:

   eq=: -:!.0

However, that's when I discovered my third problem: I could get my 
series of "if" comparisons to work perfectly for data I created 
manually, but they would NOT work correctly for data in a loaded file 
which LOOKS identical.

Here are two examples, the first with data from a loaded file, the 
second with data I created to look just like the loaded data (sorry 
about the possibly crazy-looking wraparounds in email):

####################################################################
   a=. readcsv (root,datafile1)
   h=. 32
   h{a
+----+-+-----------------------------+---+-+++---+----------+----+-+----
-----------------------------------------------------------------------
+
|SMLC|G|012 Smile.Communications 
Ltd.|tlw|x|||ISR|10/31/2007|1040|S|Provides various telecomm broadband, 
roaming and traditional voice services|
+----+-+-----------------------------+---+-+++---+----------+----+-+----
-----------------------------------------------------------------------
+
   datatype h{a
boxed

   ]b=. ((0 1 2){h{a),'0';((8 9){h{a)
+----+-+-----------------------------+-+----------+----+
|SMLC|G|012 Smile.Communications Ltd.|0|10/31/2007|1040|
+----+-+-----------------------------+-+----------+----+
   datatype b
boxed

   ]c=. > 1{b
G
   datatype c
literal

   ('G' eq c)
0
####################################################################
   ]b3=. 'SMLC';'G';'012 Smile.Communications 
Ltd.';'0';'10/31/2007';'1040'
+----+-+-----------------------------+-+----------+----+
|SMLC|G|012 Smile.Communications Ltd.|0|10/31/2007|1040|
+----+-+-----------------------------+-+----------+----+
   datatype b3
boxed

   ]c3=. > 1{b3
G
   datatype c3
literal

   ('G' eq c3)
1
####################################################################

As you can see, the type of expression ('G' eq c) that I use in my 
series of "if" comparisons worked correctly when I manually created the 
original row containing boxed data (second example above).  However, as 
you can also see, that same expression did NOT work correctly in the 
first example, where the original row containing boxed data came from a 
loaded file.

My questions:  Why does this happen?  How do I need to code things so 
that the data comparisons work correctly?

The above was working with the "if" control structure, which created a 
lengthy list of comparisons with identical "do" actions.  How do I have 
to code the "select" structure to make it work correctly, as above?  I 
was trying to do something like the following:

   select. c
      case. 'N';'A';'Q';'GS';'G';'GM';'S';'Qsc';'AUS' do.
         found=. found , b
   end.

As I said, I thought this short, little project was going to be easy, 
but there 
must be something about J's loaded files that I don't understand at 
all.  Help 
and explanations would be greatly appreciated! Thanks in advance!


Harvey

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to