Skip to content

Commit 00488b2

Browse files
committed
Don't build quoted_fields array when not needed
1 parent e75132e commit 00488b2

File tree

3 files changed

+15
-11
lines changed

3 files changed

+15
-11
lines changed

lib/csv/fields_converter.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ class CSV
44
# Note: Don't use this class directly. This is an internal class.
55
class FieldsConverter
66
include Enumerable
7+
8+
NO_QUOTED_FIELDS = [] # :nodoc:
9+
def NO_QUOTED_FIELDS.[](_index)
10+
false
11+
end
12+
NO_QUOTED_FIELDS.freeze
13+
714
#
815
# A CSV::FieldsConverter is a data structure for storing the
916
# fields converter properties to be passed as a parameter
@@ -44,7 +51,7 @@ def empty?
4451
@converters.empty?
4552
end
4653

47-
def convert(fields, headers, lineno, quoted_fields)
54+
def convert(fields, headers, lineno, quoted_fields=NO_QUOTED_FIELDS)
4855
return fields unless need_convert?
4956

5057
fields.collect.with_index do |field, index|

lib/csv/parser.rb

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -757,7 +757,7 @@ def prepare_header
757757
case headers
758758
when Array
759759
@raw_headers = headers
760-
quoted_fields = [false] * @raw_headers.size
760+
quoted_fields = FieldsConverter::NO_QUOTED_FIELDS
761761
@use_headers = true
762762
when String
763763
@raw_headers, quoted_fields = parse_headers(headers)
@@ -941,11 +941,9 @@ def parse_no_quote(&block)
941941
if line.empty?
942942
next if @skip_blanks
943943
row = []
944-
quoted_fields = []
945944
else
946945
line = strip_value(line)
947946
row = line.split(@split_column_separator, -1)
948-
quoted_fields = [false] * row.size
949947
if @max_field_size
950948
row.each do |column|
951949
validate_field_size(column)
@@ -959,7 +957,7 @@ def parse_no_quote(&block)
959957
end
960958
end
961959
@last_line = original_line
962-
emit_row(row, quoted_fields, &block)
960+
emit_row(row, &block)
963961
end
964962
end
965963

@@ -981,7 +979,7 @@ def parse_quotable_loose(&block)
981979
next
982980
end
983981
row = []
984-
quoted_fields = []
982+
quoted_fields = FieldsConverter::NO_QUOTED_FIELDS
985983
elsif line.include?(@cr) or line.include?(@lf)
986984
@scanner.keep_back
987985
@parse_method = :parse_quotable_robust
@@ -1043,13 +1041,13 @@ def parse_quotable_robust(&block)
10431041
quoted_fields << @quoted_column_value
10441042
elsif parse_row_end
10451043
if row.empty? and value.nil?
1046-
emit_row([], [], &block) unless @skip_blanks
1044+
emit_row(row, &block) unless @skip_blanks
10471045
else
10481046
row << value
10491047
quoted_fields << @quoted_column_value
10501048
emit_row(row, quoted_fields, &block)
10511049
row = []
1052-
quoted_fields = []
1050+
quoted_fields.clear
10531051
end
10541052
skip_needless_lines
10551053
start_row
@@ -1254,7 +1252,7 @@ def start_row
12541252
@scanner.keep_start
12551253
end
12561254

1257-
def emit_row(row, quoted_fields, &block)
1255+
def emit_row(row, quoted_fields=FieldsConverter::NO_QUOTED_FIELDS, &block)
12581256
@lineno += 1
12591257

12601258
raw_row = row

lib/csv/writer.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ def <<(row)
4040
@lineno += 1
4141

4242
if @fields_converter
43-
quoted_fields = [false] * row.size
44-
row = @fields_converter.convert(row, nil, lineno, quoted_fields)
43+
row = @fields_converter.convert(row, nil, lineno)
4544
end
4645

4746
i = -1

0 commit comments

Comments
 (0)