PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > comp.lang.ruby > n00b question
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
n00b question

Réponse
 
LinkBack Outils de la discussion
Vieux 27/05/2008, 15h51   #1
Tim Wolak
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut 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#{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/.

  Réponse avec citation
Vieux 27/05/2008, 19h36   #2
Todd Benson
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: n00b question

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

  Réponse avec citation
Vieux 27/05/2008, 20h48   #3
Todd Benson
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: n00b question

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

  Réponse avec citation
Vieux 28/05/2008, 10h17   #4
Robert Klemme
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: n00b question

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

  Réponse avec citation
Vieux 28/05/2008, 10h18   #5
Robert Klemme
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: n00b question

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

  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 10h51.


Édité par : vBulletin® version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières ©2000-2008
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,16164 seconds with 13 queries