Ruby's CSV library can read comma-separated text directly from a string.

csv parse CSV rows can be parsed with headers so each field has a readable name.

CSV Reading

target
csv_reading.rb
Replay: real traced execution (multi-file project)
require "csv"

target = "Ada"
csv_text = "name,score\nAda,90\nMatz,85\nGrace,70\n"
rows = CSV.parse(csv_text, headers: true)

match = rows.find { |row| row["name"] == target }
score = match["score"].to_i
level = score >= 80 ? "ready" : "practice"

puts "target=#{target}"
puts "score=#{score}"
puts "level=#{level}"
require "csv"

target = "Matz"
csv_text = "name,score\nAda,90\nMatz,85\nGrace,70\n"
rows = CSV.parse(csv_text, headers: true)

match = rows.find { |row| row["name"] == target }
score = match["score"].to_i
level = score >= 80 ? "ready" : "practice"

puts "target=#{target}"
puts "score=#{score}"
puts "level=#{level}"
require "csv"

target = "Grace"
csv_text = "name,score\nAda,90\nMatz,85\nGrace,70\n"
rows = CSV.parse(csv_text, headers: true)

match = rows.find { |row| row["name"] == target }
score = match["score"].to_i
level = score >= 80 ? "ready" : "practice"

puts "target=#{target}"
puts "score=#{score}"
puts "level=#{level}"
  1. target ← Ada, csv_text ← name,score\nAda,90\nMatz,85\nGrace,70\n

    1require "csv"23target→ Ada = "Ada"  #@target="Matz", "Grace"4csv_text→ name,score\nAda,90\nMatz,85\nGrace,70\n = "name,score\nAda,90\nMatz,85\nGrace,70\n"5rows→ name,score\nAda,90\nMatz,85\nGrace,70\n = CSV.parse(csv_text, headers: true)name,score\nAda,90\nMatz,85\nGrace,70\n67match→ Ada,90\n = rowsname,score\nAda,90\nMatz,85\nGrace,70\n.find { |row| row["name"] == target }8score→ 90 = match["score"].to_i909level→ ready = score90 >= 80 ? "ready" : "practice"1011puts "target=#{targetAda}"12puts "score=#{score90}"13puts "level=#{levelready}"
    outputtarget=Ada
    score=90
    level=ready
  1. target ← Matz, csv_text ← name,score\nAda,90\nMatz,85\nGrace,70\n

    1require "csv"23target→ Matz = "Matz"4csv_text→ name,score\nAda,90\nMatz,85\nGrace,70\n = "name,score\nAda,90\nMatz,85\nGrace,70\n"5rows→ name,score\nAda,90\nMatz,85\nGrace,70\n = CSV.parse(csv_text, headers: true)name,score\nAda,90\nMatz,85\nGrace,70\n67match→ Matz,85\n = rowsname,score\nAda,90\nMatz,85\nGrace,70\n.find { |row| row["name"] == target }8score→ 85 = match["score"].to_i859level→ ready = score85 >= 80 ? "ready" : "practice"1011puts "target=#{targetMatz}"12puts "score=#{score85}"13puts "level=#{levelready}"
    outputtarget=Matz
    score=85
    level=ready
  1. target ← Grace, csv_text ← name,score\nAda,90\nMatz,85\nGrace,70\n

    1require "csv"23target→ Grace = "Grace"4csv_text→ name,score\nAda,90\nMatz,85\nGrace,70\n = "name,score\nAda,90\nMatz,85\nGrace,70\n"5rows→ name,score\nAda,90\nMatz,85\nGrace,70\n = CSV.parse(csv_text, headers: true)name,score\nAda,90\nMatz,85\nGrace,70\n67match→ Grace,70\n = rowsname,score\nAda,90\nMatz,85\nGrace,70\n.find { |row| row["name"] == target }8score→ 70 = match["score"].to_i709level→ practice = score70 >= 80 ? "ready" : "practice"1011puts "target=#{targetGrace}"12puts "score=#{score70}"13puts "level=#{levelpractice}"
    outputtarget=Grace
    score=70
    level=practice