Skip to content

Commit

Permalink
Add CSV::TSV class for tab-separated values (#319)
Browse files Browse the repository at this point in the history
GitHub: fix GH-272

This adds `CSV::TSV` that uses `\t` as the default column separator.

How to use:

```ruby
require "csv"

# Read TSV file with default tab separator
CSV::TSV.read("data.tsv")

# Parse TSV string
CSV::TSV.parse("a\tb\tc")

# Generate TSV content
CSV::TSV.generate do |tsv|
  tsv << ["a", "b", "c"]
  tsv << [1, 2, 3]
end
```

Reported by kojix2. Thanks!!!

---------

Co-authored-by: Sutou Kouhei <kou@cozmixng.org>
  • Loading branch information
jsxs0 and kou authored Nov 25, 2024
1 parent 3a7e7c7 commit 7b8c3ca
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
6 changes: 6 additions & 0 deletions lib/csv.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2129,6 +2129,12 @@ def initialize(data,
writer if @writer_options[:write_headers]
end

class TSV < CSV
def initialize(data, **options)
super(data, **({col_sep: "\t"}.merge(options)))
end
end

# :call-seq:
# csv.col_sep -> string
#
Expand Down
32 changes: 32 additions & 0 deletions test/csv/test_tsv.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
require_relative "helper"

class TestTSV < Test::Unit::TestCase
def test_default_separator
tsv = CSV::TSV.new(String.new)
assert_equal("\t", tsv.col_sep)
end

def test_override_separator
tsv = CSV::TSV.new(String.new, col_sep: ",")
assert_equal(",", tsv.col_sep)
end

def test_read_tsv_data
data = "a\tb\tc\n1\t2\t3"
result = CSV::TSV.parse(data)
assert_equal([["a", "b", "c"], ["1", "2", "3"]], result.to_a)
end

def test_write_tsv_data
output = String.new
CSV::TSV.generate(output) do |tsv|
tsv << ["a", "b", "c"]
tsv << ["1", "2", "3"]
end
assert_equal("a\tb\tc\n1\t2\t3\n", output)
end

def test_inheritance
assert_kind_of(CSV, CSV::TSV.new(String.new))
end
end

0 comments on commit 7b8c3ca

Please sign in to comment.