Skip to main content

custom_converters_casting

🛠️ Define Custom CSV Converters

The built-in converters (:integer, :float, :date) are handy, but you can define your own for specialized data types. Custom converters apply transformations as each field is parsed, keeping your post-processing logic clean.

require 'csv'

CSV::Converters[:upcase_string] = lambda do |field|
field && field.strip.upcase
end

options = {
headers: true,
converters: [:integer, :date, :upcase_string]
}

CSV.foreach('data.csv', **options) do |row|
# row['NAME'] is already upcased
puts "ID: #{row['id']}, Name: #{row['NAME']}"
end

By registering your lambda under CSV::Converters, you can reuse it across multiple CSV reads or even gemify a suite of common converters.