Bird
Raised Fist0
Rubyprogramming~30 mins

CSV library basics in Ruby - Mini Project: Build & Apply

Choose your learning style10 modes available
CSV library basics
📖 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

  1. Step 1: Understand CSV.foreach purpose

    The method CSV.foreach is designed to read CSV files line by line.
  2. Step 2: Identify the output format

    Each line is yielded as an array of strings representing the cells in that row.
  3. Final Answer:

    Reads a CSV file line by line, yielding each row as an array. -> Option A
  4. 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

  1. Step 1: Identify mode for writing

    To write to a CSV file, the mode should be 'w' (write mode).
  2. Step 2: Match syntax with CSV.open

    The correct syntax is CSV.open('file.csv', 'w') do |csv| ... end to open for writing.
  3. Final Answer:

    CSV.open('file.csv', 'w') do |csv| ... end -> Option D
  4. 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

  1. Step 1: Understand CSV.foreach behavior

    It reads each line and yields an array of strings split by commas.
  2. Step 2: Analyze puts row.inspect output

    Using puts row.inspect prints the array representation of each row.
  3. Final Answer:

    ["name", "age"]\n["Alice", "30"]\n["Bob", "25"] -> Option B
  4. Quick Check:

    CSV.foreach yields arrays, inspect shows arrays [OK]
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

  1. Step 1: Check CSV.open usage for writing rows

    CSV expects each row as an array of fields, not a single string.
  2. Step 2: Identify the incorrect row format

    The line csv << 'name,age' should be csv << ['name', 'age'] to write two columns.
  3. Final Answer:

    The first csv << should be an array, not a string. -> Option A
  4. 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

  1. Step 1: Understand CSV.foreach usage for reading

    CSV.foreach reads each row as an array, allowing manual hash construction.
  2. Step 2: Build hash from first and second columns

    Assigning hash[row[0]] = row[1] correctly maps keys to values.
  3. Final Answer:

    hash = {} CSV.foreach('file.csv') do |row| hash[row[0]] = row[1] end -> Option C
  4. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard