Project

General

Profile

Actions

Bug #15388

closed

CSV parsing behaviour in > 2.5.0

Bug #15388: CSV parsing behaviour in > 2.5.0

Added by dharshandj@gmail.com (Dharshan Bharathuru) almost 7 years ago. Updated almost 7 years ago.

Status:
Closed
Target version:
-
ruby -v:
2.5.1
[ruby-core:90342]

Description

Hi,

It seems like CSV library in 2.5.0 is not behaving as intended while parsing.

header = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q"]

csv_str = "10.4710|859.5170|9000.0000|Y||0.0000||NRM|0||||N|Y|P|NRM|\r\n11.4710|869.5170|9000.0000|Y||0.0000||NRM|0||||N|Y|P|NRM|\r\n"

CSV.parse(csv_str, col_sep: '|', write_headers: true, headers: header)[0]
# produces junk
# #<CSV::Row "A":"0" "B":nil "C":"NRM" "D":"0" "E":nil "F":nil "G":nil "H":"N" "I":"Y" "J":"P" "K":"NRM" "L":nil "M":nil "N":nil "O":nil "P":nil "Q":nil>

But without write_headers option it produces correct parsing.

CSV.parse(csv_str, col_sep: '|', headers: header)[0]

# #<CSV::Row "A":"10.4710" "B":"859.5170" "C":"9000.0000" "D":"Y" "E":nil "F":"0.0000" "G":nil "H":"NRM" "I":"0" "J":nil "K":nil "L":nil "M":"N" "N":"Y" "O":"P" "P":"NRM" "Q":nil>

Updated by nobu (Nobuyoshi Nakada) almost 7 years ago Actions #1 [ruby-core:90343]

  • Description updated (diff)

Why do you want to write headers when parsing?

Updated by nobu (Nobuyoshi Nakada) almost 7 years ago Actions #2 [ruby-core:90344]

Maybe an error is expected?

diff --git i/lib/csv.rb w/lib/csv.rb
index dca2a45b6a..e4ad55085c 100644
--- i/lib/csv.rb
+++ w/lib/csv.rb
@@ -687,8 +687,9 @@
   # You pass your +str+ to read from, and an optional +options+ containing
   # anything CSV::new() understands.
   #
-  def self.parse(*args, &block)
-    csv = new(*args)
+  def self.parse(data, write_headers: nil, **options, &block)
+    raise ArgumentError.new("Cannot write headers when parsing") if write_headers
+    csv = new(data, **options)
 
     return csv.each(&block) if block_given?
 
@@ -707,7 +708,8 @@
   #
   # The +options+ parameter can be anything CSV::new() understands.
   #
-  def self.parse_line(line, **options)
+  def self.parse_line(line, write_headers: nil, **options)
+    raise ArgumentError.new("Cannot write headers when parsing") if write_headers
     new(line, options).shift
   end
 
diff --git i/test/csv/test_csv_parsing.rb w/test/csv/test_csv_parsing.rb
index e65bbad92e..7e45a429ef 100755
--- i/test/csv/test_csv_parsing.rb
+++ w/test/csv/test_csv_parsing.rb
@@ -239,6 +239,29 @@
                  CSV.parse("a b  d", col_sep: " "))
   end
 
+  def test_parse_write_headers
+    data = "a,b,c"
+    headers = %w[A B C]
+    Tempfile.create(%w[parsing .csv]) do |f|
+      f.puts data
+      f.close
+      File.open(f.path) {|f|
+        assert_raise(ArgumentError) {
+          CSV.parse(f, write_headers: true, headers: headers)
+        }
+        assert_raise(ArgumentError) {
+          CSV.parse_line(f, write_headers: true, headers: headers)
+        }
+      }
+    end
+    assert_raise(ArgumentError) {
+      CSV.parse(data, write_headers: true, headers: headers)
+    }
+    assert_raise(ArgumentError) {
+      CSV.parse_line(data, write_headers: true, headers: headers)
+    }
+  end
+
   private
 
   def assert_parse_errors_out(*args)

Updated by dharshandj@gmail.com (Dharshan Bharathuru) almost 7 years ago Actions #3 [ruby-core:90345]

nobu (Nobuyoshi Nakada) wrote:

Why do you want to write headers when parsing?

I needed a object-key reference in future references instead of index based references.

Updated by nobu (Nobuyoshi Nakada) almost 7 years ago Actions #4 [ruby-core:90347]

(Dharshan Bharathuru) wrote:

I needed a object-key reference in future references instead of index based references.

It doesn't need to write headers.

Updated by kou (Kouhei Sutou) almost 7 years ago Actions #5 [ruby-core:90348]

It seems that this has been fixed in csv master.
I've released csv gem 3.0.1. Can you try it?

Updated by kou (Kouhei Sutou) almost 7 years ago Actions #6 [ruby-core:90349]

  • Status changed from Open to Assigned
  • Assignee set to kou (Kouhei Sutou)

Arguments validation may be better but we need more works for it. For example, we need to add similar logic to CSV.read for this case.

Anyone who wants to work on argument validation should send pull requests to https://github.com/ruby/csv .

Updated by dharshandj@gmail.com (Dharshan Bharathuru) almost 7 years ago Actions #7 [ruby-core:90354]

kou (Kouhei Sutou) wrote:

It seems that this has been fixed in csv master.
I've released csv gem 3.0.1. Can you try it?

Thanks. Working fine with version 3.0.1.

Updated by kou (Kouhei Sutou) almost 7 years ago Actions #8 [ruby-core:90355]

  • Status changed from Assigned to Closed

OK. I'll close this.

Actions

Also available in: PDF Atom