Преобразователь :all
означает, что он пробует все встроенные преобразователи, в частности:
:integer: Converts any field Integer() accepts.
:float: Converts any field Float() accepts.
:date: Converts any field Date::parse() accepts.
:date_time: Converts any field DateTime::parse() accepts.
По сути, это означает, что он будет пытаться преобразовать любое поле в эти значения (если это возможно) вместо того, чтобы оставлять их в виде строки. Поэтому, если вы сделаете row[i]
и он вернет строковое значение '9', он вместо этого вернет целочисленное значение 9.
Преобразователи заголовков изменяют способ использования заголовков для индексации строки. Например, если вы делаете что-то вроде этого:
FastCSV.foreach(some_file, :header_converters => :downcase) do |row|
Вы бы проиндексировали столбец с заголовком «Some Header» как row['some header']
.
Если бы вы использовали :symbol
вместо этого, вы бы проиндексировали его с row[:some_header]
. Символ пресекает имя заголовка, заменяет пробелы подчеркиванием и удаляет символы, отличные от a-z, 0-9 и _
. Это полезно, потому что сравнение символов намного быстрее, чем сравнение строк.
Если вы хотите проиндексировать столбец с помощью row['Some Header']
, просто не указывайте параметр :header_converter
.
EDIT:
В ответ на ваш комментарий, я боюсь, headers_convert не будет делать то, что вы хотите. Это не меняет значения строки заголовка, только то, как они используются в качестве индекса. Вместо этого вам придется использовать опцию :return_headers
, определить строку заголовка и внести изменения. Чтобы изменить файл и записать его снова, вы можете использовать что-то вроде этого:
require 'fastercsv'
input = File.open 'original.csv', 'r'
output = File.open 'modified.csv', 'w'
FasterCSV.filter input, output, :headers => true, :write_headers => true, :return_headers => true do |row|
change_headers(row) if row.header_row?
end
input.close
output.close
Если вам необходимо полностью заменить исходный файл, добавьте эту строку после выполнения вышеуказанного:
FileUtils.mv 'modified.csv', 'original.csv', :force => true