N00b question

Can someone explain to me why my script is printing the key to my hash
twice? I need it to print the key then the value on the first iteration
and on the second iteration it should only print the value. I am
getting information from two files, the account numbers and balances and
displaying account number, yesterday balance, today balance and the
difference.

Account = Struct.new(:account_number, :balance_yesterday,
:balance_today) do
  def difference
    balance_today - balance_yesterday
  end

  def to_s
    "#{account_number}\t#{balance_yesterday}\t#{balance_today}\t#{difference}\n"
  end
end

class SktyFut
  attr_reader :acct

  def initialize(filename)
    @acct = File.new(filename, "r")
  end

  def future_data
    @sktylist = Hash.new(0)
    @acct.each do |list|
      office = list[21..23] # =>
      if office == "RPT"
        next
      else
        acctnum = list[24..28]
      end
      lv = list[217..230]
      is_negative = list[215,1] == "-"
      value = lv.to_f/100
      value = -value if is_negative

      # Add vales to hash

      @sktylist[acctnum] += value
      end
    return @sktylist
  end
end

Dir.chdir("/Users/twolak")
post = SktyFut.new("FutBalances20080507.txt")
a = post.future_data
#puts a
pre = SktyFut.new("FutBalances20080506.txt")
b = pre.future_data
#puts b
my_hash = Hash.new {|h,k| h[k] = Account.new(k)}
a.each do |acc_nr, balance|
  my_hash[acc_nr].balance_yesterday = balance
end
b.each do |key, balance|
  my_hash[key].balance_today = balance
end

g = my_hash.to_s.sort
puts g

(the math will be wrong here as I have to take out info for security)
700700 1854.54 5652.05 3237970.2
701701 654.18 654.18 0.0
702702 99.07 99.07 0.0

···

--
Posted via http://www.ruby-forum.com/.

Tim, are you trying to do something along the lines of this? (spacing
is irrelevant since you specify that by column number, I'm using
letters for account names instead of your numbers, but it doesn't
matter)...

post.txt:
   a 1
   b - 2
   a - 4
   b 8
RPT1 2
RPT
   g - 1

prev.txt:
   a 2
   b - 2
   a 0
   b 7
   z 9
RPT1 2

run_report.rb:
post = Hash.new(0)
IO.foreach("post.txt") do |line|
  post[line[3..3]] += line[5..7].to_i.to_f unless line[0..2] == "RPT"
end

prev = Hash.new(0)
IO.foreach("prev.txt") do |line|
  prev[line[3..3]] += line[5..7].to_i.to_f unless line[0..2] == "RPT"
end

report = {}

(post.keys | prev.keys).each do |k|
  report[k] = post[k], prev[k], post[k] - prev[k]
end

p report

Now, this I would "pretty" up significantly, but I'm just trying to
get an idea of what your after.

Todd

···

On Tue, May 27, 2008 at 9:51 AM, Tim Wolak <tim.wolak@gmail.com> wrote:

Account = Struct.new(:account_number, :balance_yesterday,
:balance_today) do
def difference
   balance_today - balance_yesterday
end

def to_s
   "#{account_number}\t#{balance_yesterday}\t#{balance_today}\t#{difference}\n"
end
end

class SktyFut
attr_reader :acct

def initialize(filename)
   @acct = File.new(filename, "r")
end

def future_data
   @sktylist = Hash.new(0)
   @acct.each do |list|
     office = list[21..23] # =>
     if office == "RPT"
       next
     else
       acctnum = list[24..28]
     end
     lv = list[217..230]
     is_negative = list[215,1] == "-"
     value = lv.to_f/100
     value = -value if is_negative

     # Add vales to hash

     @sktylist[acctnum] += value
     end
   return @sktylist
end
end

Dir.chdir("/Users/twolak")
post = SktyFut.new("FutBalances20080507.txt")
a = post.future_data
#puts a
pre = SktyFut.new("FutBalances20080506.txt")
b = pre.future_data
#puts b
my_hash = Hash.new {|h,k| h[k] = Account.new(k)}
a.each do |acc_nr, balance|
my_hash[acc_nr].balance_yesterday = balance
end
b.each do |key, balance|
my_hash[key].balance_today = balance
end

g = my_hash.to_s.sort
puts g

(the math will be wrong here as I have to take out info for security)
700700 1854.54 5652.05 3237970.2
701701 654.18 654.18 0.0
702702 99.07 99.07 0.0

You are printing key and value of your hash and since the value also
contains the account number you see it twice. You probably rather
want:

my_hash.sort.each |k,v|
  puts v
end

Kind regards

robert

···

2008/5/27 Tim Wolak <tim.wolak@gmail.com>:

Can someone explain to me why my script is printing the key to my hash
twice? I need it to print the key then the value on the first iteration
and on the second iteration it should only print the value. I am
getting information from two files, the account numbers and balances and
displaying account number, yesterday balance, today balance and the
difference.

g = my_hash.to_s.sort
puts g

--
use.inject do |as, often| as.you_can - without end

...some code that didn't paste correctly (the spaces).

This is what it is supposed be...

post.txt:
   a 1
   b - 2
   a - 4
   b 8
RPT1 2
RPT
   g - 1

prev.txt:
   a 2
   b - 2
   a 0
   b 7
   z 9
RPT1 2

run_report.rb:
post = Hash.new(0)
IO.foreach("post.txt") do |line|
  post[line[3..3]] += line[5..7].to_i.to_f unless line[0..2] == "RPT"
end

prev = Hash.new(0)
IO.foreach("prev.txt") do |line|
  prev[line[3..3]] += line[5..7].to_i.to_f unless line[0..2] == "RPT"
end

report = {}

(post.keys | prev.keys).each do |k|
  report[k] = post[k], prev[k], post[k] - prev[k]
end

p report

...and no empty lines in your data files, or you'll have to ignore
them, too, in your program.

I figured out what happened. I copied, then pasted back to my editor,
then copied back again.

Sorry,

Todd

···

On Tue, May 27, 2008 at 1:36 PM, Todd Benson <caduceass@gmail.com> wrote:

Here's an alternative

puts my_hash.values.sort_by {|v| v.account_number}

Cheers

robert

···

2008/5/28 Robert Klemme <shortcutter@googlemail.com>:

2008/5/27 Tim Wolak <tim.wolak@gmail.com>:

Can someone explain to me why my script is printing the key to my hash
twice? I need it to print the key then the value on the first iteration
and on the second iteration it should only print the value. I am
getting information from two files, the account numbers and balances and
displaying account number, yesterday balance, today balance and the
difference.

g = my_hash.to_s.sort
puts g

You are printing key and value of your hash and since the value also
contains the account number you see it twice. You probably rather
want:

my_hash.sort.each |k,v|
puts v
end

--
use.inject do |as, often| as.you_can - without end