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