Project

rbcsv

0.0
No release in over 3 years
A Ruby gem that provides fast CSV processing capabilities using Rust extensions for performance-critical operations
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Runtime

~> 0.9.91
 Project Readme

RbCsv

https://rubygems.org/gems/rbcsv

Installation

Add this line to your Gemfile:

gem 'rbcsv'

Or install directly:

gem install rbcsv

Usage

require 'rbcsv'

# Parse CSV string
csv_data = "name,age,city\nAlice,25,Tokyo\nBob,30,Osaka"
result = RbCsv.parse(csv_data)
# => [["name", "age", "city"], ["Alice", "25", "Tokyo"], ["Bob", "30", "Osaka"]]

# Parse with whitespace trimming
result = RbCsv.parse!(" name , age \n Alice , 25 ")
# => [["name", "age"], ["Alice", "25"]]

# Read from file
result = RbCsv.read("data.csv")

# Write to file
data = [["name", "age"], ["Alice", "25"], ["Bob", "30"]]
RbCsv.write("output.csv", data)

# Type-aware parsing (converts numbers automatically)
result = RbCsv.parse_typed("name,age,score\nAlice,25,85.5")
# => [["name", "age", "score"], ["Alice", 25, 85.5]]

API Reference

Basic Methods

  • RbCsv.parse(string) - Parse CSV string
  • RbCsv.parse!(string) - Parse with trimming
  • RbCsv.read(filepath) - Read CSV file
  • RbCsv.read!(filepath) - Read with trimming
  • RbCsv.write(filepath, data) - Write CSV file

Type-aware Methods

  • RbCsv.parse_typed(string) - Parse with type conversion
  • RbCsv.parse_typed!(string) - Parse with trimming and type conversion
  • RbCsv.read_typed(filepath) - Read with type conversion
  • RbCsv.read_typed!(filepath) - Read with trimming and type conversion

Benchmark

Currently, we achieve 2.4 to 3.8 times faster processing for parse operations, with even greater speed improvements for type conversion.

Compared to casting to arbitrary forms using Ruby methods, parse_typed with pre-defined type conversion delivers approximately 140 times faster results.

exec data 2025/10/04

% ruby examples/benchmarks/benchmark.rb

file: bench.csv
file size: 16457 bytes
recode: 100
🚀 parse (1000 times)
--------------------------------------------------
                                               user     system      total        real
Ruby CSV.parse                             0.258438   0.002993   0.261431 (  0.261500)
Ruby CSV.parse (headers: true)             0.329098   0.001348   0.330446 (  0.330398)
RbCsv.parse                                0.085052   0.000358   0.085410 (  0.085403)
RbCsv.parse! (with trim)                   0.112470   0.000246   0.112716 (  0.112703)
RbCsv.parse_typed                          0.096728   0.000512   0.097240 (  0.097227)
RbCsv.parse_typed! (typed + trim)          0.128616   0.000478   0.129094 (  0.129075)

📁 read (1000 times)
--------------------------------------------------
                                               user     system      total        real
Ruby CSV.read                              0.273029   0.030768   0.303797 (  0.398752)
Ruby CSV.read (headers: true)              0.360198   0.027133   0.387331 (  0.478200)
RbCsv.read                                 0.088287   0.021659   0.109946 (  0.169075)
RbCsv.read! (with trim)                    0.119157   0.016301   0.135458 (  0.149894)
RbCsv.read_typed                           0.105971   0.016317   0.122288 (  0.136625)
RbCsv.read_typed! (typed + trim)           0.137821   0.017739   0.155560 (  0.174861)

✏️ write (1000 times)
--------------------------------------------------
                                               user     system      total        real
Ruby CSV.open (write)                      0.409897   0.355344   0.765241 (  1.894642)
RbCsv.write                                0.097875   0.505652   0.603527 (  1.595586)

test data createing
ccreated: large_sample.csv (831947 bytes)
size: 831947 bytes

🔢 parse_typed (1000 times )
--------------------------------------------------
                                               user     system      total        real
Manual conversion (CSV)                    6.093143   0.011365   6.104508 (  6.104026)
Manual conversion (RbCsv)                  6.217609   0.023237   6.240846 (  6.287587)
Automatic conversion (RbCsv typed)         0.000041   0.000001   0.000042 (  0.000041)

Contributing

Found a bug or have a suggestion? Please open an issue on GitHub.

Pull requests are welcome! For major changes, please open an issue first to discuss what you would like to change.

Author

Fujitani Sora 📧 fujitanisora0414@gmail.com 🐙 @fujitanisora

License

MIT License. See LICENSE for details.