1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

[ruby/csv] Fix a parse bug when split character exists in middle of column value

GitHub: fix #115

Reported by TOMITA Masahiro. Thanks!!!

https://github.com/ruby/csv/commit/398b3564c5
This commit is contained in:
Sutou Kouhei 2019-12-25 06:59:43 +09:00 committed by Nobuyoshi Nakada
parent aeac7db823
commit 814bfc8adc
No known key found for this signature in database
GPG key ID: 7CD2805BFA3770C6
Notes: git 2020-07-20 03:35:46 +09:00
2 changed files with 13 additions and 3 deletions

View file

@ -446,6 +446,7 @@ class CSV
@strip = @options[:strip]
@escaped_strip = nil
@strip_value = nil
@rstrip_value = nil
if @strip.is_a?(String)
case @strip.length
when 0
@ -460,6 +461,8 @@ class CSV
if @quote_character
@strip_value = Regexp.new(@escaped_strip +
"+".encode(@encoding))
@rstrip_value = Regexp.new(@escaped_strip +
"+\\z".encode(@encoding))
end
@need_robust_parsing = true
elsif @strip
@ -467,6 +470,7 @@ class CSV
@escaped_strip = strip_values.encode(@encoding)
if @quote_character
@strip_value = Regexp.new("[#{strip_values}]+".encode(@encoding))
@rstrip_value = Regexp.new("[#{strip_values}]+\\z".encode(@encoding))
end
@need_robust_parsing = true
end
@ -561,9 +565,6 @@ class CSV
unless @liberal_parsing
no_unquoted_values << @escaped_quote_character
end
if @escaped_strip
no_unquoted_values << @escaped_strip
end
@unquoted_value = Regexp.new("[^".encode(@encoding) +
no_unquoted_values +
"]+".encode(@encoding))
@ -939,6 +940,7 @@ class CSV
if @liberal_parsing
quoted_value = parse_quoted_column_value
if quoted_value
@scanner.scan_all(@strip_value) if @strip_value
unquoted_value = parse_unquoted_column_value
if unquoted_value
if @double_quote_outside_quote
@ -986,6 +988,9 @@ class CSV
end
end
value.gsub!(@backslash_quote_character, @quote_character) if @backslash_quote
if @rstrip_value
value.gsub!(@rstrip_value, "")
end
value
end

View file

@ -21,6 +21,11 @@ class TestCSVParseStrip < Test::Unit::TestCase
CSV.parse_line(%Q{a ,b }, strip: true))
end
def test_middle
assert_equal(["a b"],
CSV.parse_line(%Q{a b}, strip: true))
end
def test_quoted
assert_equal([" a ", " b "],
CSV.parse_line(%Q{" a "," b "}, strip: true))