[#387246] newbie question — sunny parker <info@2020proj.com>

i am coming from php and dont seem to quite understand how ruby works

13 messages 2011/09/01

[#387330] installing naive bayes classifier — aya abdelsalam <ayoya_91@...>

Hello

10 messages 2011/09/02

[#387344] Beginner needing help - Writing right-angle triangle program — Kane Williams <theburrick@...>

I've been going through a Haskell tutorial (Just to see what it's like)

12 messages 2011/09/03

[#387356] Which version should I download? — Vladimir Van Bauenhoffer <cluny_gisslaren@...>

Im new to programming and Im thinking of downloading and starting with

17 messages 2011/09/03

[#387392] loops problem — jack jones <shehio_22@...>

for (j = @array.length ; j > counter ; j = j-1) # counter is a variable

13 messages 2011/09/04

[#387469] posts on Unix systems programming — Eric Wong <normalperson@...>

I would like to do a series of mailing list posts on the subject of Unix

28 messages 2011/09/06

[#387530] Unexpected behavior of Ruby array — Suvankar Satpati <suvankar.17@...>

I was going through the exercises at http://rubykoans.com/ and got

11 messages 2011/09/08

[#387544] Executing the output of a look — dwight schrute <spambocks@...>

Hi,

14 messages 2011/09/08

[#387586] Creating a hash from two arrays — simon harrison <simonharrison.uk@...>

Hi. Can anyone help with this? I'd like to end with a hash like so:

15 messages 2011/09/09

[#387596] newbie ruby installation malloc issue — "mark e." <mark_f_edwards@...>

hi all -

12 messages 2011/09/09

[#387614] how to write data in binary to a file? — frank hi <yw_hi@163.com>

Hi,

11 messages 2011/09/10

[#387646] How do I make output generate a float without an excess numbers of decimal places? — Kane Williams <theburrick@...>

For example, my current code is

11 messages 2011/09/11

[#387725] Any downsides to writing paranthesises? — Vladimir Van Bauenhoffer <cluny_gisslaren@...>

Im a newbie programmer who is trying to learn Ruby after having just

18 messages 2011/09/12

[#387811] Get interpreter path — Michal Suchanek <hramrach@...>

Hello,

26 messages 2011/09/14
[#387842] Re: Get interpreter path — Phillip Gawlowski <cmdjackryan@...> 2011/09/14

On Wed, Sep 14, 2011 at 3:35 PM, Michal Suchanek <hramrach@centrum.cz> wrot=

[#387844] Re: Get interpreter path — Michal Suchanek <hramrach@...> 2011/09/14

On 14 September 2011 20:47, Phillip Gawlowski <cmdjackryan@gmail.com> wrote:

[#387814] Tough Ruby Homework — Rory Pascua <rorypascua@...>

I'm trying to take a long piece of text, find a word, and get that word

18 messages 2011/09/14

[#387853] Can I Safely Use Rubinius While Learning? — Aaron Jackson <jacksonaaronc@...>

Greetings,

18 messages 2011/09/15

[#387915] Some newbie questions — Vladimir Van Bauenhoffer <cluny_gisslaren@...>

I got some newbie questions which I would very much appreciate if

14 messages 2011/09/15

[#388003] Ruby Speed Question — Kevin Anon <oblivious.sage@...>

Wrote my first Ruby program recently for a class assignment where we had

12 messages 2011/09/18

[#388078] appending \n to each element in an array — Joe Collins <joec_49@...>

I have an array

13 messages 2011/09/20

[#388123] Turning on a special program at special time and turning off the computer at another special time — "amir e." <aef1370@...>

I decided to write a program in RUBY wherein these items have been done

11 messages 2011/09/21
[#388124] Re: Turning on a special program at special time and turning off the computer at another special time — andrew mcelroy <sophrinix@...> 2011/09/21

That sounds like a program a special program a terrorist would write. Are

[#388198] Conditional statements with multiple arguments — "Thomas B." <sinixlol@...>

Good afternoon everyone,

18 messages 2011/09/24

[#388203] Ruby 1.9.3 RC1 is out — "Yuki Sonoda (Yugui)" <yugui@...>

-----BEGIN PGP SIGNED MESSAGE-----

19 messages 2011/09/24
[#388208] Re: [ANN] Ruby 1.9.3 RC1 is out — Quintus <sutniuq@...> 2011/09/24

-----BEGIN PGP SIGNED MESSAGE-----

[#388209] Re: [ANN] Ruby 1.9.3 RC1 is out — Chris White <cwprogram@...> 2011/09/24

[#388214] Re: [ANN] Ruby 1.9.3 RC1 is out — Quintus <sutniuq@...> 2011/09/24

-----BEGIN PGP SIGNED MESSAGE-----

[#388216] Re: [ANN] Ruby 1.9.3 RC1 is out — Yusuke Endoh <mame@...> 2011/09/24

Hello,

[#388248] Looking for better/familiar approach to command line opts — "Perl J." <perljunkie@...>

So I guess the warning to the reader upfront is... I'm a bit of a Perl

14 messages 2011/09/25

[#388333] Get all classes from a list of files — Jeroen van Ingen <jeroeningen@...>

I have a list of ruby files. I would like to create objects from all

11 messages 2011/09/28

[#388342] Ruby Syntax @keywords ||= [ ] — Bhavesh Sharma <sharmabhavesh@...>

Sorry if this comes across as a dumb question, but what does the

11 messages 2011/09/28

[#388366] IO.readlines will not accept variable with file name Why? — Joda jenson <jodajen2@...>

I am fairly new to Ruby and I am stuck on this. Would someone have a

13 messages 2011/09/29
[#388368] Re: IO.readlines will not accept variable with file name Why? — Robert Klemme <shortcutter@...> 2011/09/29

On Thu, Sep 29, 2011 at 11:14 AM, Joda jenson <jodajen2@yahoo.com> wrote:

Re: Ruby code style / Regular Expression to remove blank lines / test case

From: Robert Klemme <shortcutter@...>
Date: 2011-09-22 11:17:29 UTC
List: ruby-talk #388148
On Thu, Sep 22, 2011 at 5:45 AM, Jim Wang <redgiant581@yahoo.com> wrote:
> Hi Group,
>
> Forgive me to put 3 seemingly irrelevant words in the subject line. But
> they are the purposes of this post.
>
> This is basically my first Ruby class, which is to remove all empty
> lines and blank times from a txt file. a simple test case is also
> included.

Welcome to the wonderful world of Ruby!

> I tested the code and it works fine. But I did not have much idea about
> if the code style is good, or if there is some potential issues. Can
> someone pls do a quick review and kindly provide some feedback?
>
> I want to know -
>
> 1) Is there any potential issue in the code? did I miss some boundary
> check?
>
> 2) Is the code style good in general?
> e.g, name convention, indent, etc.

I usually indent with two spaces per level but I guess that's a matter of t=
aste.

> 3) what can i do if i want to make it more professional?
> e.g., better choice of functions, error-handling, object-oriented,
> test-driven, =A0etc.
>
> I am open to any feedback - as far as they help make better Ruby
> programing.
>
>
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> # a copy is included as below
>
> require 'test/unit'
>
> # this class is to remove all the empty and blank lines.
> #
> # Usage: ruby Blanker.rb input.txt output.txt
>
> class =A0BlankLineRemover
> =A0def initialize()
> =A0 =A0puts "BlankLineRemover initialized."

I wouldn't put an unconditional output to stdout here since users of
the class might not be interested in that information.

> =A0end
>
> =A0def generate(input_filename, output_filename)
>
> =A0 =A0reader =3D File.read(input_filename)

You are reading the whole file into memory which can lead to dramatic
failure if the file is large.  However, it's not needed since you can
easily pull this off by reading one line at a time.

> =A0 =A0f =3D File.new(output_filename, "w")
>
> =A0 =A0f.puts remove(reader)
>
> =A0 =A0f.close

Here you are not using the block form of File.open which will leave an
open file descriptor in case of exceptions being thrown from method
#remove.
http://blog.rubybestpractices.com/posts/rklemme/001-Using_blocks_for_Robust=
ness.html

> =A0end
>
> =A0def =A0remove(stringToremove)
>
> =A0 =A0regEx =3D /^[\s]*$\n/

You do not need the character class.  So you can do /^\s*$\n/.
However I would pick another approach.  I would just read lines and
decide based on regular expression whether I write them to the output
file. (see below)

> =A0 =A0stringToReturn =3D stringToremove.gsub(regEx, '')

It's more efficient to use the regular expression directly in the gsub call=
.

> =A0 =A0stringToReturn.strip!

Basically #strip is sufficient - you don't need the #gsub:

irb(main):002:0> "   \n".strip
=3D> ""
irb(main):003:0> " \t  \n".strip
=3D> ""

For methods and local variables we usually use "string_to_return"
instead of camel case.

> =A0 =A0if stringToReturn.length >=3D 1
> =A0 =A0 =A0return stringToReturn
> =A0 =A0else
> =A0 =A0 =A0return ""
> =A0 =A0end

This distinction is useless and even a bit harmful: the else branch
will always create a new instance which won't happen if you simply
return stringToReturn.

> =A0end
>
> end
>
> class TestCleaner < Test::Unit::TestCase
> =A0def test_basic
>
> =A0 =A0sInput1 =3D "line1\n\t\nline4\n\tline5\n"
> =A0 =A0sExpectedOutput1 =3D "line1\nline4\n\tline5"
>
> =A0 =A0sInput2=3D""
> =A0 =A0sExpectedOutput2 =3D ""
>
> =A0 =A0sInput3=3D"\n\t\t\n"
> =A0 =A0sExpectedOutput3 =3D ""

I would not define these as variables but directly use the literals in
method calls.  Much more readable because the information is more
local.

> =A0 =A0testCleaner =3D BlankLineRemover.new
> =A0 =A0assert_equal(sExpectedOutput1, testCleaner.remove(sInput1))
> =A0 =A0assert_equal(sExpectedOutput2, testCleaner.remove(sInput2))
> =A0 =A0assert_equal(sExpectedOutput3, testCleaner.remove(sInput3))
>
> =A0end
> end
>
> unless ARGV.length =3D=3D 2
> =A0puts "Usage: ruby Blanker.rb input.txt output.txt\n"
> =A0exit
> end
>
> simpleRemover =3D BlankLineRemover.new
>
> simpleRemover.generate(ARGV[0],ARGV[1])
>
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
>
> Attachments:
> http://www.ruby-forum.com/attachment/6616/Blanker.rb

=3D=3D=3D SPOILER ALERT =3D=3D=3D

For just removing empty lines a whole class is not needed and might be
a bit heavy.  You can do it in a few lines like this

File.open ARGV[1], "w" do |out|
  File.foreach ARGV[0] do |line|
    line.strip!
    out.puts line unless line.empty?
  end
end

:-)

It's a bit more robust to do it like this though, because then you
avoid opening (and thus creating) the output file if the input is
missing:

File.open ARGV[0] do |in|
  File.open ARGV[1], "w" do |out|
    in.each do |line|
      line.strip!
      out.puts line unless line.empty?
    end
  end
end

If you want to get more fancy and decouple the reading and writing
from the transformation you could define a method for the purpose of
reading and writing and leave the transformation and decision whether
to output to a block passed:

def copy_file(file_in, file_out)
  File.open file_out, "w" do |out|
    File.foreach file_in do |line|
      line =3D yield(line) and out.puts line
    end
  end
end

copy_file ARGV[0], ARGV[1] do |line|
  line.strip!
  line.empty? ? nil : line
end

... or for inserting comments (i.e. prefix each line with "# ")

copy_file ARGV[0], ARGV[1] do |line|
  "# " << line
end

But I'm digressing...  Hope that was not too much detail. :-}

Kind regards

robert

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

In This Thread

Prev Next