Trouble comparing a NULL in Ruby

Hey folks,

I am currently writing a script that functions as follows:

It will first open up a connection to our local database and run a SQL
script I have written in, then create an excel file based off of that
SQL query. From that point it will sit until changes have potentially
been made in the database. At that point the excel file that had been
made and then saved off will be called again as a master record to
compare to the same SQL query and new excel file which will be created.
I have it written so that from the command prompt one would simply call
the .rb script, state whether the master record is being created or
there is a check being made to a previously made excel file and what the
name of that file is. This is where my problem enters in, is that if
there are blanks in the master file, as in nothing in the field in
either the SQL query and thereby in the excel file, it chokes and won’t
fire if there is a legitimate input in a later file.

Let me illustrate:

“” == “foo”

would pass back true.

Perhaps this is a problem with the Spreadsheet gem that I am using and
in that case this is an inappropriate place to ask for assistance, if
so, my apologies. The code in question has been attached.

I have tried several different things, including using ‘.empty’,
‘.nil?’, and what is written there now in an attempt to have it either
write it as ‘NULL’ when creating the master sheet, or to catch it when
making a check as it is written.

I feel like the way to solve this is to have it catch the empty cells
when it is being parsed, but I haven’t been able to do that yet, and the
reason why I am asking.

Thanks in advance!

On Fri, Nov 18, 2011 at 9:59 PM, Stephen B. [email protected]
wrote:

I have it written so that from the command prompt one would simply call

would pass back true.

I don’t see how that could be. I would start by inspecting elements
you compare and which return (seemingly) wrong results along with
their class.

when it is being parsed, but I haven’t been able to do that yet, and the
reason why I am asking.

Thanks in advance!

Attachments:
http://www.ruby-forum.com/attachment/6755/newbill.rb

It’s a bit difficult to sift through all the code especially since you
do not make much use of variables. You loose two advantages: by
storing results of expressions you evaluate repeatedly in a variable
code becomes more efficient. And, probably more important, by having
a named entity code becomes more readable if you choose a telling name
for the variable. I mean this for example

    if sheet.row(j).at(i).to_s != ""
      print "Error: "
      print sheet.row(j).to_a.at(i)
      print " "
      puts results[j].to_a.at(i)
    end

At least “sheet.row(j)” repeats but I reckon you rather want
“sheet.row(j).at(i)” in a variable.

You can certainly make a few things shorter, e.g.

begin
if (ARGV[1].to_s.end_with?(“.xls”))
else
raise
end
rescue
puts “The file name is invalid, please be sure it ends with ‘.xls’”
exit!
end

abort “The file name is invalid, please be sure it ends with ‘.xls’”
unless ARGV[1].end_with? ‘.xls’

And what do you need that empty block for?

results = result.each(:symbolize_keys => true, :as => :array,
:cache_rows => true, :empty_sets => true) do |rowset| end

Generally I would approach this a bit differently: I would store the
result in a file as a marshaled object graph. Then do later
comparisons against this. The excel would just be derived from that
state if the query result had changed. This avoids having to reparse
the excel sheet again and again.

Kind regards

robert