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:
parent
aeac7db823
commit
814bfc8adc
Notes:
git
2020-07-20 03:35:46 +09:00
2 changed files with 13 additions and 3 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in a new issue