📖 Scenario: You work in a small bookstore. You have a CSV file listing books and their prices. You want to read this file and find books cheaper than a certain price.
🎯 Goal: Build a Ruby program that reads a CSV file of books and prices, filters books cheaper than a set price, and prints their titles.
📋 What You'll Learn
Use Ruby's CSV library to read data
Create a variable for the price limit
Use a loop to filter books cheaper than the limit
Print the titles of the filtered books
💡 Why This Matters
🌍 Real World
Reading and filtering CSV data is common in many jobs like sales, inventory, and data analysis.
💼 Career
Knowing how to use Ruby's CSV library helps you handle real data files and automate tasks in many programming jobs.
Progress0 / 4 steps
1
Create the CSV data as a string
Create a variable called csv_data and set it to this exact string including newlines: "Title,Price\nRuby Basics,25\nJavaScript Guide,30\nPython Intro,20"
Ruby
Hint
Use double quotes and include newline characters \n exactly as shown.
2
Set the price limit
Create a variable called price_limit and set it to the integer 25
Ruby
Hint
Just assign the number 25 to price_limit.
3
Parse CSV and filter books cheaper than price_limit
Use require 'csv' to load the CSV library. Then create a variable called cheap_books that uses CSV.parse on csv_data with headers: true. Use .select with a block that keeps rows where the Price converted to integer is less than price_limit. Then map the result to get an array of the Title values.
Ruby
Hint
Use CSV.parse with headers: true, then select rows with price less than price_limit, then map to get titles.
4
Print the titles of cheap books
Write a puts statement to print the cheap_books array.
Ruby
Hint
Use puts to print the array. It will print each title on its own line.
Practice
(1/5)
1. What does the Ruby CSV method CSV.foreach do?
easy
A. Reads a CSV file line by line, yielding each row as an array.
B. Writes data to a CSV file line by line.
C. Converts a CSV file into a hash with headers as keys.
D. Deletes a CSV file from the system.
Solution
Step 1: Understand CSV.foreach purpose
The method CSV.foreach is designed to read CSV files line by line.
Step 2: Identify the output format
Each line is yielded as an array of strings representing the cells in that row.
Final Answer:
Reads a CSV file line by line, yielding each row as an array. -> Option A
Quick Check:
CSV.foreach reads lines as arrays [OK]
Hint: Remember: foreach reads rows, open writes rows [OK]
Common Mistakes:
Confusing reading with writing methods
Thinking it returns a hash instead of an array
Assuming it deletes files
2. Which of the following is the correct syntax to open a CSV file for writing in Ruby?
easy
A. CSV.read('file.csv', 'w')
B. CSV.open('file.csv', 'r') do |csv| ... end
C. CSV.foreach('file.csv') do |csv| ... end
D. CSV.open('file.csv', 'w') do |csv| ... end
Solution
Step 1: Identify mode for writing
To write to a CSV file, the mode should be 'w' (write mode).
Step 2: Match syntax with CSV.open
The correct syntax is CSV.open('file.csv', 'w') do |csv| ... end to open for writing.
Final Answer:
CSV.open('file.csv', 'w') do |csv| ... end -> Option D
Quick Check:
Open with 'w' writes CSV [OK]
Hint: Use 'w' mode with CSV.open to write files [OK]
Common Mistakes:
Using 'r' mode which is for reading
Using CSV.foreach for writing
Using CSV.read with mode argument
3. What will be the output of this Ruby code?
require 'csv'
CSV.foreach('data.csv') do |row|
puts row.inspect
end
Assuming data.csv contains:
name,age
Alice,30
Bob,25
medium
A. Error: CSV.foreach requires a block
B. ["name", "age"]\n["Alice", "30"]\n["Bob", "25"]
C. ["name,age"]\n["Alice,30"]\n["Bob,30"]
D. name,age\nAlice,30\nBob,25
Solution
Step 1: Understand CSV.foreach behavior
It reads each line and yields an array of strings split by commas.
Step 2: Analyze puts row.inspect output
Using puts row.inspect prints the array representation of each row.
Final Answer:
["name", "age"]\n["Alice", "30"]\n["Bob", "25"] -> Option B
Hint: CSV.foreach yields arrays; inspect shows array format [OK]
Common Mistakes:
Expecting raw CSV string output
Confusing puts with print
Missing block for CSV.foreach
4. Identify the error in this Ruby code snippet:
require 'csv'
CSV.open('output.csv', 'w') do |csv|
csv << 'name,age'
csv << ['Alice', 30]
end
medium
A. The first csv << should be an array, not a string.
B. Missing require statement for CSV library.
C. The file mode 'w' is invalid for CSV.open.
D. csv << cannot accept arrays.
Solution
Step 1: Check CSV.open usage for writing rows
CSV expects each row as an array of fields, not a single string.
Step 2: Identify the incorrect row format
The line csv << 'name,age' should be csv << ['name', 'age'] to write two columns.
Final Answer:
The first csv << should be an array, not a string. -> Option A
Quick Check:
CSV rows must be arrays [OK]
Hint: Write rows as arrays, not comma strings [OK]
Common Mistakes:
Passing a string instead of array for a row
Forgetting to require 'csv'
Using wrong file mode
5. You want to read a CSV file and create a hash where the first column is the key and the second column is the value. Which Ruby code correctly does this using the CSV library?
hard
A. hash = CSV.read('file.csv').to_h
B. hash = CSV.open('file.csv', 'w') { |csv| csv.to_h }
C. hash = {}
CSV.foreach('file.csv') do |row|
hash[row[0]] = row[1]
end
D. hash = CSV.foreach('file.csv') { |row| row.to_h }
Solution
Step 1: Understand CSV.foreach usage for reading
CSV.foreach reads each row as an array, allowing manual hash construction.
Step 2: Build hash from first and second columns
Assigning hash[row[0]] = row[1] correctly maps keys to values.
Final Answer:
hash = {}
CSV.foreach('file.csv') do |row|
hash[row[0]] = row[1]
end -> Option C
Quick Check:
foreach + manual hash build = correct [OK]
Hint: Use foreach and assign hash keys manually [OK]
Common Mistakes:
Using CSV.read.to_h which doesn't convert arrays to hash
Using CSV.open with 'w' mode for reading
Expecting row.to_h to work directly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.