diff options
author | Joakim Antman <antmanj@gmail.com> | 2021-10-03 22:10:48 +0300 |
---|---|---|
committer | Sutou Kouhei <kou@cozmixng.org> | 2021-10-24 05:57:33 +0900 |
commit | 7f3dd601c895354c041988251a0be05a8a423664 (patch) | |
tree | bfe09f2aa1818fc07aeeb54c24aa55078865d47c | |
parent | 39ecdabe67d1bc7c864ada6f282590dbc9d3a14e (diff) |
[ruby/csv] Changed line ending handling to consider the combination \r\n as a single entry when row is faulty (https://github.com/ruby/csv/pull/220)
https://github.com/ruby/csv/commit/29cef9ea9d
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/5010
-rw-r--r-- | lib/csv/parser.rb | 8 | ||||
-rw-r--r-- | test/csv/parse/test_invalid.rb | 13 |
2 files changed, 17 insertions, 4 deletions
diff --git a/lib/csv/parser.rb b/lib/csv/parser.rb index 2fb3b0a46e..d0b02a6423 100644 --- a/lib/csv/parser.rb +++ b/lib/csv/parser.rb @@ -526,7 +526,7 @@ class CSV @cr = "\r".encode(@encoding) @lf = "\n".encode(@encoding) - @cr_or_lf = Regexp.new("[\r\n]".encode(@encoding)) + @line_end = Regexp.new("\r\n|\n|\r".encode(@encoding)) @not_line_end = Regexp.new("[^\r\n]+".encode(@encoding)) end @@ -914,7 +914,7 @@ class CSV message = "Any value after quoted field isn't allowed" raise MalformedCSVError.new(message, @lineno) elsif @unquoted_column_value and - (new_line = @scanner.scan(@cr_or_lf)) + (new_line = @scanner.scan(@line_end)) ignore_broken_line message = "Unquoted fields do not allow new line " + "<#{new_line.inspect}>" @@ -923,7 +923,7 @@ class CSV ignore_broken_line message = "Illegal quoting" raise MalformedCSVError.new(message, @lineno) - elsif (new_line = @scanner.scan(@cr_or_lf)) + elsif (new_line = @scanner.scan(@line_end)) ignore_broken_line message = "New line must be <#{@row_separator.inspect}> " + "not <#{new_line.inspect}>" @@ -1089,7 +1089,7 @@ class CSV def ignore_broken_line @scanner.scan_all(@not_line_end) - @scanner.scan_all(@cr_or_lf) + @scanner.scan_all(@line_end) @lineno += 1 end diff --git a/test/csv/parse/test_invalid.rb b/test/csv/parse/test_invalid.rb index 9dfd081380..ddb59e2b9a 100644 --- a/test/csv/parse/test_invalid.rb +++ b/test/csv/parse/test_invalid.rb @@ -36,4 +36,17 @@ ggg,hhh,iii csv.shift) assert_equal(true, csv.eof?) end + + def test_ignore_invalid_line_cr_lf + data = <<-CSV +"1","OK"\r +"2",""NOT" OK"\r +"3","OK"\r +CSV + csv = CSV.new(data) + + assert_equal(['1', 'OK'], csv.shift) + assert_raise(CSV::MalformedCSVError) { csv.shift } + assert_equal(['3', 'OK'], csv.shift) + end end |