parsing a file's contents

A

Ant 23

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.

Attachments:
http://www.ruby-forum.com/attachment/3550/numbers.rb
 
A

Andrew Timberlake

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.

Attachments:
http://www.ruby-forum.com/attachment/3550/numbers.rb

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/ProgrammingRuby/index.html

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
 
R

Rick DeNatale

[Note: parts of this message were removed to make it a legal post.]

On Sun, Apr 5, 2009 at 2:32 AM, Andrew Timberlake <
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.

Attachments:
http://www.ruby-forum.com/attachment/3550/numbers.rb

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 <-


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-variables-values-and-objects


--
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
 
P

Parsiya Ha

# 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]
 
A

Alexey Borzenkov

Ant said:
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.
 
A

Ant 23

Andrew said:
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/ProgrammingRuby/index.html

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,998
Messages
2,570,242
Members
46,834
Latest member
vina0631

Latest Threads

Top