From: Robert Klemme Date: 2011-11-19T19:43:26+09:00 Subject: Re: Trouble comparing a NULL in Ruby On Fri, Nov 18, 2011 at 9:59 PM, Stephen Beckman wrote: > 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. 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. > 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! > > 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 -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/