|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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#{balanc e_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/. |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
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#{balanc e_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 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 |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
On Tue, May 27, 2008 at 1:36 PM, Todd Benson <caduceass@gmail.com> wrote:
...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 |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
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 Kind regards robert -- use.inject do |as, often| as.you_can - without end |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
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 Here's an alternative puts my_hash.values.sort_by {|v| v.account_number} Cheers robert -- use.inject do |as, often| as.you_can - without end |
|
![]() |
| Outils de la discussion | |
|
|