require 'date' now = Date.today # Get today's date object $thisday, $thismonth, $thisyear = now.mday, now.month, now.year class CD # Brokered Bank CD class include Comparable attr_reader :size, :cusip, :issuer, :fyield, :matures, :ayield, :duration def initialize(size, cusip, issuer, fyield, matures, ayield) @size, @cusip, @issuer, @yld, @ayield = size, cusip, issuer, fyield, ayield parts = matures.split('/') # Get MM/DD/YYYY portions mat_mo, mat_day, mat_yr = parts[0], parts[1], parts[2] @matures = mat_yr + '/' + mat_mo + '/' +mat_day delta_yr = mat_yr.to_i - $thisyear # Years away from maturity delta_mo = mat_mo.to_i + (delta_yr * 12) - $thismonth # Determine months to maturity delta_mo -= 1 if $thisday > mat_day.to_i # Disregard partial month @duration = delta_mo # Months to maturity end def showCD # Format a CD into columns sprintf "%4.4s %9.9s %-25.25s %5.5s %11.11s %-5.5s %2.2s-mo\n", @size, @cusip, @issuer, @yld, @matures, @ayield, @duration end def <=>(other) # Designate comparison field self.ayield <=> other.ayield # Use actual CD yield end end class CD_List # Container for available CDS @@sortkey1, @@sortkey2 = 'ayield', 'cusip' # Default sort keys def initialize @list_of_CDs = Array.new # Use array for container end def add_CD(aCD) @list_of_CDs.push(aCD) # Store pointer in container self # Allow chaining end def [](key) # Support indexing @list_of_CDs[key] end # Sort Container array on CD field names supplied via parms def new_ord(key1='size',key2='matures') @@sortkey1, @@sortkey2 = key1, key2 # Sets Class variables @list_of_CDs.sort! { |a,b| cmp_item(a,b) } # Sort in place end def cmp_item (a,b) # Sort comparator # Allow variable sort fields via Class variables f1 = eval('a.'+@@sortkey1) <=> eval('b.'+@@sortkey1) f2 = eval('a.'+@@sortkey2) <=> eval('b.'+@@sortkey2) (f1 == 0 ? f2 : f1) end end listCD = CD_List.new # Create CD list container entry = Array.new # Holder for I/P CD fields reg1 = %r{^( |more|Buy|Book|Order|Qty|CUSIP|Issue|Coupon|Maturity|Your|100\.000)} # Identify unwanted lines reg2 = %r{^$} # Identify empty lines DATA.each do |$_| # Step thru Opera obtained CD data next if $_ =~ reg1 # Drop unwanted lines next if $_ =~ reg2 $_.sub!(/\bCd\b.*/, "") # Remove issuer qualifiers $_.sub!(/Condition.*/, "") $_.sub!(/N\/A.*/, "") $_.sub!(/$\n/, "") entry.push($_) # Save remainder if entry.size == 6 # Record complete entry[4].sub!(/\/ 200/, '/200') # Squeeze out blank aCD = CD.new(*entry) # Create a CD instance entry.clear # Reset array listCD.add_CD(aCD) # Store -> in container end end puts "________ Sorted by field1 and field5 _____" listCD.new_ord.each do |thisCD| # Default of size & matures print thisCD.showCD # Sorted by designated field end puts "\n________ Sorted by field5 and field2 _____" listCD.new_ord('matures','cusip').each do |thisCD| print thisCD.showCD # Sorted by designated field end print listCD[1] < listCD[3], " " # Test the comparator puts listCD[-5] < listCD[-2] # Test the comparator __END__ 585 211163BE9 Continental Bk Salt Lk Ci Conditional Puts - Death of holder 4.400 10/29/ 2007 100.00000 4.4 200 42235FAP0 Heartland Bk Leawood Kans Conditional Puts - Death of holder 4.400 10/29/ 2007 100.00000 4.4 256 203573BB5 Cmnty Bk Pickens Cd Mo Conditional Puts - Death of holder 4.350 10/29/ 2007 100.00000 4.35 326 33765PAF7 Firstcity Bk Stockbridge Conditional Puts - Death of holder 4.450 10/31/ 2007 100.00000 4.45 200 70153QAY6 Parkway Bk Plano Tx Cd Fd Conditional Puts - Death of holder 4.400 11/01/ 2007 100.00000 4.4 250 20056QEP4 Commerce Bk Geneva Mn Cd Conditional Puts - Death of holder 4.450 11/02/ 2007 100.00000 4.45