How to use csv files in ruby

I am able to write parts of the code but I am not able to join the code
and use loops. I am quite new to RUBY and trying to do this project.

We have a list of customers
We have a list of products.

The customer is asked if he is new or returning
A new customer puts in his information and the customer database is
populated with his information if new customer
if existing customer, then with his name his details are pulled from the
database

Then he has to enter the shopping cart with the product names and
quantity,
Then from the product table, the price of the product table, the price
of the product and the total (quantity*price) is calculated
in the end
it should print out the list of the products quantity price
total sum
tax
shipping
and
total= total sum+tax+shipping

all this information should be in a new csv file with the customer
information and saved in the folder.

this is what I have so far and I am freaking out.Its all over the place

require 'csv'
# Getting Information from the new customer and updating the csv file
puts "Are you a new cuntomer? y/n"
ans = gets.chomp
while ans == 'y' do

module CustomerRelated
class Customer
  def initialize( customer_id, fname, lname, address1, address2, city,
state, zip, ph_no)
  @fname = fname
  @lname = lname
  @address1 = address1
  @address1 = address1
  @city = city
  @state = state
  @zip = zip
  @ph_no = ph_no
  end

  puts "Enter first name"
  fname = gets.chomp
  puts "Enter last name"
  lname = gets.chomp
  puts "Enter your street address"
  address1= gets.chomp
  puts "Enter your House no./Apt no."
  address2= gets.chomp
  puts "Enter the City"
  city = gets.chomp
  puts "Enter the State"
  state = gets.chomp
  puts "Enter your Zip code"
  zip = gets.chomp
  puts "Enter your Phone Number"
  ph_no = gets.chomp

  #getting the customer data in the file
    CSV.open("customer.csv", "a") do |csv|
    #csv << ["First_Name", "Last_Name", "Address_1", "City" , "Zip" ,
"Ph_No"]
    csv << [fname, lname, address1, address2, city, state, zip, ph_no]

  end

end

puts "What is your First Name?"

class Sale
  def initialize( product_name, product_id, price, quantity,
total_price, tax, payment_type, shipping)

  @product_name = product_name
  @product_id = product_id
  @price = price
  @quantity = quantity
  @total_price = total_price
  @tax = tax
  @payment_type = payment_type
  @shipping = shipping

  end

  puts "Enter name of the product"
  product_name = gets.chomp
  puts "Enter the quantity"
  quantity = gets.chomp.to_i

  CSV.foreach("products.csv", "r") do |row|
    if product_name == row[1]
     product_id = row[0]
      price = row[2].to_f # fetch, convert from string, and store in
`price variable`
      total_price = (price * quantity)

  #getting the customer data in the file
    CSV.open("Shopping_list.csv", "a") do |csv|
    #csv << ["First_Name", "Last_Name", "Address_1", "City" , "Zip" ,
"Ph_No"]
    csv << [product_id, product_name, price, quantity, total_price]

  end

  puts "Do you have more products to add ? (y/n)?"
  answer = gets.chomp
  if answer = y then

  else
  #calculating shipping and tax
  sub_total=0
  puts "Your Sub total is"
  CSV.foreach("Shopping_list.csv", "r") do |row|
  sub_total= {for |x| do row[4]

  puts "Enter your zip code"
  zip = gets.chomp

  CSV.foreach("zipcode.csv") do |row|
  if zipcode == row[0]

  shipping = row[1]

Attachments:
http://www.ruby-forum.com/attachment/6742/products.csv
http://www.ruby-forum.com/attachment/6743/customer.csv

···

--
Posted via http://www.ruby-forum.com/.

hello sharma,

  i think you'll be able to figure this out better if you follow some
simple formatting guidelines that make reading code much easier for
others and for you! it's a good idea to indent each block, making it
easier to follow the flow of the code to spot missing `end`s that wreak
havoc. something like:

class Engine
    def initialize(...)
        ...
        if ...
            ...
            ...
        end
        ...
        ...
    end
end

  a good habit to get into is that whenever you make a call that
requires an end statement, write the `end` immediately after making the
call, before writing any of the code that goes in between - that way
you're sure that you close every loop or block that you open... start
like this:

class Engine
end

  ...and not like this:

class Engine
    def inialize

  ...if you indent your above code, you'll see that there are a lot of
missing `ends` and it is pretty 'all over the place...' maybe try
starting over - and start simply...

  if i understand correctly, what you're doing here is making a
salesperson who asks if we are a current customer or not before making a
sale. so start by making a salesperson...

class Salesperson
end

  it's not much, but it won't give you any errors! now, the first thing
we want this guy to do when we call him is to ask if the person at the
other end of the terminal is a current client, right?

class Salesperson

  def initialize(name)
    puts "Hi, I'm #{name}, are you a current customer? (y/n) "
    answer = gets.chomp.downcase
    if answer == "y"
      sell_to_customer
    elsif answer == "n"
      register_new_customer
    else
      raise "answer must be 'y' or 'n'"
    end
  end

  def sell_to_customer
  end

  def register_new_customer
  end

end

joe = Salesman.new("Joe")

  ...so, we create a salesman called joe, and he asks us if we're a
current customer or not. if we are, a sell_to_customer method is
called, otherwise a register_new_customer method is called - these are
both things that salespeople do every day...

  write little bits of code and run it often to see where it breaks...
notice that you can call methods before writing them fully - it's enough
to just define and end them, to make sure you're getting that far. so
after running this, the next thing you could think of is what a
salesperson does when he or she registers a new customer...

  first they ask you questions, and then they record that information
(not the other way around, this is important!) so back in the
Salesperson class add some stuff to the register_new_customer method:

  def register_new_customer
    puts "What's your first name please: "
    fname = gets.chomp
  end

  ...this gets a string from the terminal and then assigns it to a
variable - the order is important, you can't call a variable before
you've assigned it.

  then you could put all the info you get into an array:

  def register_new_customer
    puts "What's your first name please: "
    fname = gets.chomp

    customer_info = []
    customer_info << fname
  end

  ...and send that array off to update your csv file.

  take things step by step, and try to do things as simply as possible -
i'm sure you'll figure it out :wink:

  good luck -

  - j

···

--
Posted via http://www.ruby-forum.com/.

I think I'll rewrite the code following formatting.
no we dont have a salesman. New or old customer can buy we just want to
know if he is existing customer so that we dont have multiple entries in
the csv file for the same person.

···

--
Posted via http://www.ruby-forum.com/.

if I take joe ( the sales person) This code should work right?? whats
wrong here?
require 'csv'

    puts "Hi, are you a current customer? (y/n) "
    answer = gets.chomp.downcase
    if answer == "y"
      sell_to_customer
    elsif answer == "n"
      register_new_customer
    else
      raise "answer must be 'y' or 'n'"
    end

def register_new_customer ( customer_id, fname, lname, address1,
address2, city, state, zip, ph_no)

  puts "Enter first name please"
  fname = gets.chomp
  puts "Enter last name please"
  lname = gets.chomp
  puts "Enter your street address please"
  address1= gets.chomp
  puts "Enter your House no./Apt no."
  address2= gets.chomp
  puts "Enter the City"
  city = gets.chomp
  puts "Enter the State"
  state = gets.chomp
  puts "Enter your Zip code"
  zip = gets.chomp
  puts "Enter your Phone Number"
  ph_no = gets.chomp
  puts "Thank you very much"

#getting the customer data in the file
CSV.open("customer.csv", "a") do |csv|
#csv << ["First_Name", "Last_Name", "Address_1", "City" , "Zip" ,
"Ph_No"]
csv << [fname, lname, address1, address2, city, state, zip, ph_no]

end
end

and then irrespective of them being new or old once they register, I
want them to go to this method

#calculating shipping and tax
def calculate_the total
  sub_total=0
  tax = 0
  shipping = 0

  puts "Your Sub total is"
  CSV.foreach("Shopping_list.csv", "r") do |row|
  sub_total= {for |x| do sub_total + row[4]}

  puts "Enter your zip code"
  zip = gets.chomp

  CSV.foreach("zipcode.csv") do |row|
  if zipcode == row[0]

  shipping = row[1]

  end
  end

···

--
Posted via http://www.ruby-forum.com/.

-----Messaggio originale-----

···

Da: Mrin alini [mailto:m.mrinali@gmail.com]
Inviato: domenica 13 novembre 2011 21:48
A: ruby-talk ML
Oggetto: How to use csv files in ruby

I am able to write parts of the code but I am not able to join the code and
use loops. I am quite new to RUBY and trying to do this project.

We have a list of customers
We have a list of products.

The customer is asked if he is new or returning A new customer puts in his
information and the customer database is populated with his information if
new customer if existing customer, then with his name his details are pulled
from the database

Then he has to enter the shopping cart with the product names and quantity,
Then from the product table, the price of the product table, the price of
the product and the total (quantity*price) is calculated in the end it
should print out the list of the products quantity price total sum tax
shipping and total= total sum+tax+shipping

all this information should be in a new csv file with the customer
information and saved in the folder.

this is what I have so far and I am freaking out.Its all over the place

require 'csv'
# Getting Information from the new customer and updating the csv file puts
"Are you a new cuntomer? y/n"
ans = gets.chomp
while ans == 'y' do

module CustomerRelated
class Customer
  def initialize( customer_id, fname, lname, address1, address2, city,
state, zip, ph_no)
  @fname = fname
  @lname = lname
  @address1 = address1
  @address1 = address1
  @city = city
  @state = state
  @zip = zip
  @ph_no = ph_no
  end

  puts "Enter first name"
  fname = gets.chomp
  puts "Enter last name"
  lname = gets.chomp
  puts "Enter your street address"
  address1= gets.chomp
  puts "Enter your House no./Apt no."
  address2= gets.chomp
  puts "Enter the City"
  city = gets.chomp
  puts "Enter the State"
  state = gets.chomp
  puts "Enter your Zip code"
  zip = gets.chomp
  puts "Enter your Phone Number"
  ph_no = gets.chomp

  #getting the customer data in the file
    CSV.open("customer.csv", "a") do |csv|
    #csv << ["First_Name", "Last_Name", "Address_1", "City" , "Zip" ,
"Ph_No"]
    csv << [fname, lname, address1, address2, city, state, zip, ph_no]

  end

end

puts "What is your First Name?"

class Sale
  def initialize( product_name, product_id, price, quantity, total_price,
tax, payment_type, shipping)

  @product_name = product_name
  @product_id = product_id
  @price = price
  @quantity = quantity
  @total_price = total_price
  @tax = tax
  @payment_type = payment_type
  @shipping = shipping

  end

  puts "Enter name of the product"
  product_name = gets.chomp
  puts "Enter the quantity"
  quantity = gets.chomp.to_i

  CSV.foreach("products.csv", "r") do |row|
    if product_name == row[1]
     product_id = row[0]
      price = row[2].to_f # fetch, convert from string, and store in `price
variable`
      total_price = (price * quantity)

  #getting the customer data in the file
    CSV.open("Shopping_list.csv", "a") do |csv|
    #csv << ["First_Name", "Last_Name", "Address_1", "City" , "Zip" ,
"Ph_No"]
    csv << [product_id, product_name, price, quantity, total_price]

  end

  puts "Do you have more products to add ? (y/n)?"
  answer = gets.chomp
  if answer = y then

  else
  #calculating shipping and tax
  sub_total=0
  puts "Your Sub total is"
  CSV.foreach("Shopping_list.csv", "r") do |row|
  sub_total= {for |x| do row[4]

  puts "Enter your zip code"
  zip = gets.chomp

  CSV.foreach("zipcode.csv") do |row|
  if zipcode == row[0]

  shipping = row[1]

Attachments:
http://www.ruby-forum.com/attachment/6742/products.csv
http://www.ruby-forum.com/attachment/6743/customer.csv

--
Posted via http://www.ruby-forum.com/.

--
Caselle da 1GB, trasmetti allegati fino a 3GB e in piu' IMAP, POP3 e SMTP autenticato? GRATIS solo con Email.it http://www.email.it/f

Sponsor:
Conto Arancio al 4,20%. Soldi sempre disponibili, zero spese, aprilo in due minuti!
Clicca qui: http://adv.email.it/cgi-bin/foclick.cgi?mid=11920&d=29-12

nehal sharma wrote in post #1031712:

I think I'll rewrite the code following formatting.

  good idea, i think you'll find it helpful.

no we dont have a salesman.

  i was thinking of the 'program' as a salesman :wink:

  good luck-

  - j

···

--
Posted via http://www.ruby-forum.com/\.

hi Nehal

nehal sharma wrote in post #1031717:

........
    elsif answer == "n"
      register_new_customer
........

def register_new_customer ( customer_id, fname, lname, address1,
address2, city, state, zip, ph_no)
........

  notice that you call register_new_customer with no arguments, but
define it to take 9 arguments. this will certainly cause errors. the
register_new_customer method is where all of that information is
collected and stored (where the 'salesman' asks you your data and
records
it...) you don't know any of that information yet when you call the
register_new_customer method, so leave off the arguments:

  .......
    elsif answer == "n"
      register_new_customer
  .......

  def register_new_customer
    puts "Enter first name please"
    fname = gets.chomp
    ........ etc.
  end

  looks like you're on the right track, keep at it!

  - j

···

--
Posted via http://www.ruby-forum.com/\.

Did u check my previous post?
obviously its not working
but I dont know why
I am very new to ruby and this is a class I had to take for object
oriented programming.
I have no prior programming experience so I dont understand most logics.
I appreciate your patience

jake kaiden wrote in post #1031718:

···

nehal sharma wrote in post #1031712:

I think I'll rewrite the code following formatting.

  good idea, i think you'll find it helpful.

no we dont have a salesman.

  i was thinking of the 'program' as a salesman :wink:

  good luck-

  - j

--
Posted via http://www.ruby-forum.com/\.

-----Messaggio originale-----

···

Da: jake kaiden [mailto:jakekaiden@yahoo.com]
Inviato: lunedì 14 novembre 2011 12:12
A: ruby-talk ML
Oggetto: Re: How to use csv files in ruby

hi Nehal

nehal sharma wrote in post #1031717:

........
    elsif answer == "n"
      register_new_customer
........

def register_new_customer ( customer_id, fname, lname, address1,
address2, city, state, zip, ph_no) ........

  notice that you call register_new_customer with no arguments, but define
it to take 9 arguments. this will certainly cause errors. the
register_new_customer method is where all of that information is collected
and stored (where the 'salesman' asks you your data and records
it...) you don't know any of that information yet when you call the
register_new_customer method, so leave off the arguments:

  .......
    elsif answer == "n"
      register_new_customer
  .......

  def register_new_customer
    puts "Enter first name please"
    fname = gets.chomp
    ........ etc.
  end

  looks like you're on the right track, keep at it!

  - j

--
Posted via http://www.ruby-forum.com/\.

--
Caselle da 1GB, trasmetti allegati fino a 3GB e in piu' IMAP, POP3 e SMTP autenticato? GRATIS solo con Email.it http://www.email.it/f

Sponsor:
Capodanno al parco Oltremare Riccione: Pacchetto hotel 3 stelle in centro + ingresso al parco.
* Mezza pensione, Internet gratis, animazione per bimbi. Scopri l'offerta!
Clicca qui: http://adv.email.it/cgi-bin/foclick.cgi?mid981&d)-12