diff options
author | hsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-17 07:56:27 +0000 |
---|---|---|
committer | hsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-17 07:56:27 +0000 |
commit | be7899bd86fb02d7683ecba3768c3bc8dea26dd5 (patch) | |
tree | 187d427bef8c1cb7ed3e846a1cf513be6e749744 /lib/csv.rb | |
parent | 6927ac1c7aa506aa5aae93f67edb2f6c952df0bd (diff) | |
download | ruby-be7899bd86fb02d7683ecba3768c3bc8dea26dd5.tar.gz |
Optimize CSV#shift.
[Bug #12373][ruby-core:75462]
Patch by Yuki Kurihara.
Benchmark:
```
Warming up --------------------------------------
csv_shift 1.000 i/100ms
new_csv_shift 1.000 i/100ms
Calculating -------------------------------------
csv_shift 1.192 (± 0.0%) i/s - 6.000 in 5.034250s
new_csv_shift 1.527 (± 0.0%) i/s - 8.000 in 5.243446s
Comparison:
new_csv_shift: 1.5 i/s
csv_shift: 1.2 i/s - 1.28x slower
```
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58770 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/csv.rb')
-rw-r--r-- | lib/csv.rb | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/lib/csv.rb b/lib/csv.rb index 336b42a697..e7aedc4558 100644 --- a/lib/csv.rb +++ b/lib/csv.rb @@ -1874,32 +1874,32 @@ class CSV parts.each do |part| if in_extended_col # If we are continuing a previous column - if part[-1] == @quote_char && part.count(@quote_char) % 2 != 0 + if part.end_with?(@quote_char) && part.count(@quote_char) % 2 != 0 # extended column ends csv[-1] = csv[-1].push(part[0..-2]).join("") if csv.last =~ @parsers[:stray_quote] raise MalformedCSVError, "Missing or stray quote in line #{lineno + 1}" end - csv.last.gsub!(@quote_char * 2, @quote_char) + csv.last.gsub!(@double_quote_char, @quote_char) in_extended_col = false else csv.last.push(part, @col_sep) end - elsif part[0] == @quote_char + elsif part.start_with?(@quote_char) # If we are starting a new quoted column if part.count(@quote_char) % 2 != 0 # start an extended column csv << [part[1..-1], @col_sep] in_extended_col = true - elsif part[-1] == @quote_char + elsif part.end_with?(@quote_char) # regular quoted column csv << part[1..-2] if csv.last =~ @parsers[:stray_quote] raise MalformedCSVError, "Missing or stray quote in line #{lineno + 1}" end - csv.last.gsub!(@quote_char * 2, @quote_char) + csv.last.gsub!(@double_quote_char, @quote_char) elsif @liberal_parsing csv << part else @@ -2017,6 +2017,7 @@ class CSV @col_sep = options.delete(:col_sep).to_s.encode(@encoding) @row_sep = options.delete(:row_sep) # encode after resolving :auto @quote_char = options.delete(:quote_char).to_s.encode(@encoding) + @double_quote_char = @quote_char * 2 if @quote_char.length != 1 raise ArgumentError, ":quote_char has to be a single character String" |