[#407882] Ruby extremely slow compared to PHP — Mick Jagger <lists@...>

Hello there, how are you? Hope you are fine. I am a PHP programmer

17 messages 2013/06/02

[#407908] TCPServer/Socket and Marshal problem — Panagiotis Atmatzidis <atma@...>

Hello,

18 messages 2013/06/03

[#407946] Is rubyquiz.com dead? — Alphonse 23 <lists@...>

Thread title says everything.

18 messages 2013/06/04

[#408012] Need help understanding recursion. — pedro oliva <lists@...>

Ive been reading Chris Pine's book 'Learn to Program' and its been going

11 messages 2013/06/06

[#408129] Getting Started With Development — Chamila Wijayarathna <cdwijayarathna@...>

I'm new to Ruby Development. I downloaded source from Github, but couldn't

24 messages 2013/06/11
[#408131] Re: Getting Started With Development — Per-erik Martin <lists@...> 2013/06/11

Ruby is often installed on linux, or can be easily installed with the

[#408146] Re: Getting Started With Development — "Chamila W." <lists@...> 2013/06/11

Per-erik Martin wrote in post #1112021:

[#408149] Re: Getting Started With Development — "Carlo E. Prelz" <fluido@...> 2013/06/11

Subject: Re: Getting Started With Development

[#408198] NokoGiri XML Parser — "Devender P." <lists@...>

Hi,

11 messages 2013/06/13

[#408201] trying to load a .rb file in irb — "Eric D." <lists@...>

I am trying to load a ruby program into irb and it will not load.

12 messages 2013/06/13

[#408205] Can I use Sinatra to render dynamic pages? — Ruby Student <ruby.student@...>

Hell Team,

18 messages 2013/06/13
[#408219] Re: Can I use Sinatra to render dynamic pages? — Nicholas Van Weerdenburg <vanweerd@...> 2013/06/14

You should be able to do this without JavaScript by using streaming.

[#408228] Re: Can I use Sinatra to render dynamic pages? — Ruby Student <ruby.student@...> 2013/06/14

Well, I got some good suggestions from everyone here. I thank you all for

[#408275] Compare and sort one array according to another. — masta Blasta <lists@...>

I have two arrays of objects that look something like this:

14 messages 2013/06/17

[#408276] Comparing objects — "Thom T." <lists@...>

How do I compare two objects in Ruby, considering only attributes

15 messages 2013/06/17

[#408307] getting the most out of Ruby — robin wood <lists@...>

I write a lot of scripts in Ruby, most are small simple things but some

13 messages 2013/06/18

[#408309] Creating ruby script exe — Rochit Sen <lists@...>

Hi All,

17 messages 2013/06/18

[#408357] Beginners problem with database and datamapper — cristian cristian <lists@...>

Hi all!

28 messages 2013/06/20

[#408437] How do I input a variable floating point number into Ruby Programs — "Michael P F." <lists@...>

I want to evaluate the following interactively:

10 messages 2013/06/23

[#408518] #!/usr/bin/env: No such file or directory — Todd Sterben <lists@...>

I am new to both linux and ruby. I am using Ubuntu and Ruby 1.9

17 messages 2013/06/27

[#408528] Designing a Cabinet class — Mike Vezzani <lists@...>

Hello all,

12 messages 2013/06/27

[#408561] Find elment in array of hashes — Rodrigo Lueneberg <lists@...>

array = {:id=>1, :price =>0.25} # index[0]

23 messages 2013/06/28

Re: A question about assignment of multidimensional array error message

From: Robert Klemme <shortcutter@...>
Date: 2013-06-21 17:09:43 UTC
List: ruby-talk #408400
On Fri, Jun 21, 2013 at 6:16 PM, Ruby Student <ruby.student@gmail.com>wrote:

> Team,
>
> The piece of code below is giving me an error which I can't find the
> solution. The assignment below for *
> msgCount[r][c] = mtc *is trwoing an exception. which I list below.
>
> Any suggestions?
>

Yes, a lot.  First of all your Ruby is not very idiomatic.  The smallest
issue is your naming with camelCase which in Ruby land is only used for
class and module names.  All others use snake_case.


> ###################################################################
> #Date      READ     ENTRY    DELETE    ALARM   HOTLIST   SITE     #
> #20130611  2000000  200000   200000    2000    2000      20000    #
> #20130611  2000000  200000   200000    2000    2000      20000    #
> ###################################################################
>

Is this above the file format?  With or without all the hashes?


> msgCount = Array.new            # Empty array. Will have size of [r][7].
> Rows will grow
>
> fn   = "/home/rb/MyData/dp/PR_LOGS/pr_time.log.*"
>
> msgTypes = ["read", "entry", "delete", "alarm", "hotlist", "site"]
>
> fnls = `ls #{fn}`.split         # Create fnls = file names list
>

Don't use backticks for this.  Just use

file_name_list = Dir["/home/rb/MyData/dp/PR_LOGS/pr_time.log.*"]


> fc = fnls.size                  # Number of files to be processed
>
> fnls.each do |f|                # Process each file
>    r = 0                        # Rows are controlled by fnls, number of
> files
>

Do you really want to reset r to 0 for every file?  That will mean that you
will later be overwriting values when you do msgCount[r][c] = mtc.  I don't
think that is what you want.


>    lp,lg,dt = f.split('.')      # this info will be used later
>
>    7.times do |c|               # Process each column
>       mtc = `grep #{msgTypes[c]} #{f} | wc -l`  # Get Message Type Count
>

I am not sure what the line above is supposed to do.  What it currently
_does_ is this: it searches in the current file for all lines containing
the current "message type" and then counts the number of those lines.  Btw,
you can do the counting with "grep -c".

This approach is quite inefficient because it will read each file 7 times.
 Oh wait, and there are only 6 elements in msgType!  One more reason not to
use a number to iterate the array but just use #each as everybody else.


>       *msgCount[r][c] = mtc*
>       r += 1                    # Next row please
>

You are incrementing r 7 * # of  file names.  Is this really what you want?
 Don't you rather want to store counts per file?

   end
> end
>

A more idiomatic way of doing what you are probably trying to do is this:
store counts in nested Hashes based on file name and message type.

msg_types = ["read", "entry", "delete", "alarm", "hotlist", "site"]

line_counts = {}

Dir["/home/rb/MyData/dp/PR_LOGS/pr_time.log.*"].each do |file_name|
# better: ARGV.each do |file_name|
  counts = Hash.new 0

  File.foreach file_name do |line|
    msg_types.each do |mt|
      counts[mt] += 1 if line.include? mt
    end
  end

  line_counts[file_name] = counts
end

# output for testing purposes only
require 'pp'
pp line_counts



> *in `block (2 levels) in <main>': undefined method `[]=' for nil:NilClass
> (NoMethodError)*
>

Joel has explained that already.

Cheers

robert


-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

In This Thread

Prev Next