Forum: Ruby parsing a file's contents

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
A3262e4c208a1cb72fc747604d36cfbd?d=identicon&s=25 Ant 23 (rubyred1)
on 2009-04-05 05:05
Attachment: numbers.rb (1 KB)
Hello all, I'm relatively new to ruby and this forum so I'm not sure I'm
posting this in the right area but here goes. My problem is I have a
file I want to read in, the file contains numbers in a CSV set-up like
so: 2, 3, 15, 25, 29 the numbers are all written out like that 5 per
row. What I want to do is split the numbers into columns that the 2 and
the number under it are all in an array. The main problem I'm having is
that when I try to put the numbers into the array I get a NoMethodError
for the String type which I don't understand since I created the every
method for the Array class not String. I attached the code any
assistance is appreciated.
5772c599ccab3081e0fffb1d54f3b6de?d=identicon&s=25 Andrew Timberlake (andrewtimberlake)
on 2009-04-05 08:34
(Received via mailing list)
On Sun, Apr 5, 2009 at 5:04 AM, Ant 23 <ahack70596@hotmail.com> wrote:
>
> Attachments:
> http://www.ruby-forum.com/attachment/3550/numbers.rb
>
> --
> Posted via http://www.ruby-forum.com/.
>
>

Here's some code that does what you need: http://gist.github.com/90389

A quick look through your code with some comments:
# <- This is completely unecessary
class Array
  def every(n)
    select{|x| index(x) % n == 0}
  end
end

# <- The way you are writing this makes this class completely
unecessary. For this simple use-case, it's okay to write it as a
simple script.
class Numbers

  #Declare the arrays that will hold the numbers when they are seperated
  colA = []
  colB = []
  colC = []
  colD = []
  colE = []

  #Declare the array that will hold all the numbers in the file <-
Ruby will fill this with a string because that's what each line of the
file will be read as
  allNumbers = []
  #now we just have to get the numbers from the file into the array <-
No need for a counter
  counter = 1
  File.open("C:\\Documents and Settings\\Desktop\\test.txt", "r") do
|infile|
    while(allNumbers = infile.gets) <- This is where ruby will change
allNumbers to a String
  #this is not working as ruby is taking the files contents as strings
not ints <- You got it
    #colA = allNumbers.every 5 #in theory should take every fifth
number from allNumbers and put it in colA
      puts "#{allNumbers.to_s}" #ok it works but now i need to put the
numbers into each different array <- It works because you're printing
out the line from the file
    colA = allNumbers.every 5 #in theory should take every fifth number
from allNumbers and put it in colA <- Won't work because you're
expecting an array
    puts "#{colA.to_s}" #print out the numbers in colA
      counter = counter + 1 #why aint this counter++  <- Because
that's not ruby, you can do counter += 1
    end
  end
end

It looks like you're coming from a Java background. Ruby tends to do
things quite differently even though it can look similar in some
respects.
Here's an online book that could be useful to get a quick overview of
Ruby -
http://www.ruby-doc.org/docs/ruby-doc-bundle/Progr...

Hope that helps

Andrew Timberlake
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

"I have never let my schooling interfere with my education" - Mark Twain
8f6f95c4bd64d5f10dfddfdcd03c19d6?d=identicon&s=25 Rick Denatale (rdenatale)
on 2009-04-05 15:41
(Received via mailing list)
On Sun, Apr 5, 2009 at 2:32 AM, Andrew Timberlake <
andrew@andrewtimberlake.com> wrote:

> > assistance is appreciated.
>
> simple script.
> class Numbers
>
>  #Declare the arrays that will hold the numbers when they are seperated
>  colA = []
>  colB = []
>  colC = []
>  colD = []
>  colE = []
>
>  #Declare the array that will hold all the numbers in the file <-


Snippage deleted.

>
> It looks like you're coming from a Java background. Ruby tends to do
> things quite differently even though it can look similar in some
> respects.


Yes, the comments about "declaring" variables in Ruby indicates a bad
transfer of knowledge from some other language. Ruby doesn't  HAVE
declarations, variables are simply references to objects, and can be
changed
over time to whatever the program causes them to be changed to.

http://talklikeaduck.denhaven2.com/2006/09/13/on-v...


--
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale
65bd7cba954fc3f1704b0f57b1011a58?d=identicon&s=25 Parsiya Ha (parsiya)
on 2009-04-05 15:43
# while( allNumbers = infile.gets)

infile.gets returns a "string" that contains a line of the file.

I guess that you want this line of code to extract the numbers in the
file and put them into the allNumbers array. Remember that gets only
reads one line in each iteration.

you can do it simply with

-- while ( allNumbers = infile.gets.scan(/\d+/) )

#scan extracts the numbers from the string and puts them into the
allNumbers array.
# now with each iteration allNumbers contains the numbers in that line.
# if you want to put fifth number in the colA array you can do it like
this.

-- while ( allNumbers = infile.gets.scan(/\d+/) )
--      colA.push(allNumbers[4])  # fifth number in allNumbers[4]
Dfa842ab64f794363e66d7cce85ba277?d=identicon&s=25 Alexey Borzenkov (snaury)
on 2009-04-05 16:56
Ant 23 wrote:
> Hello all, I'm relatively new to ruby and this forum so I'm not sure I'm
> posting this in the right area but here goes. My problem is I have a
> file I want to read in, the file contains numbers in a CSV set-up like
> so: 2, 3, 15, 25, 29 the numbers are all written out like that 5 per
> row. What I want to do is split the numbers into columns that the 2 and
> the number under it are all in an array. The main problem I'm having is
> that when I try to put the numbers into the array I get a NoMethodError
> for the String type which I don't understand since I created the every
> method for the Array class not String. I attached the code any
> assistance is appreciated.

cols = []
row = 0
file.each_line do |line|
  line.chomp.split(/\s*,\s*/).each_with_index do |num, col|
    cols[col] ||= []
    cols[col][row] = num.to_i rescue nil
  end
  row += 1
end

Now cols[0] contains the first column, and so on.
A3262e4c208a1cb72fc747604d36cfbd?d=identicon&s=25 Ant 23 (rubyred1)
on 2009-04-05 18:54
Andrew Timberlake wrote:
> It looks like you're coming from a Java background. Ruby tends to do
> things quite differently even though it can look similar in some
> respects.
> Here's an online book that could be useful to get a quick overview of
> Ruby -
> http://www.ruby-doc.org/docs/ruby-doc-bundle/Progr...
>
> Hope that helps
>
> Andrew Timberlake
> http://ramblingsonrails.com
> http://www.linkedin.com/in/andrewtimberlake
>
> "I have never let my schooling interfere with my education" - Mark Twain

yes I mostly work in java so ruby is kind of new to me, although there
are some similarities, I notice that I am writing ruby like I'm writing
in java and thats when the differences show up. Thanks for the link I'm
am going to study it and thanks for the explanation.
This topic is locked and can not be replied to.