2016-01-21 4 views
0

У меня есть некоторые данные, которые я писал из одной CSV в другую CSV, потому что мне нужно сделать некоторые манипуляции с данными.Конвертер Ruby CSV, удалите все конверторы?

Я заметил, что в библиотеке CSV есть некоторые преобразователи по умолчанию, которые принимают мои значения, которые выглядят как даты и разбор их в новые строки даты.

Мне было интересно, смогу ли я удалить все конвертеры? Я попытался использовать свой собственный конвертер, но независимо от того, что я делаю, кажется, что даты продолжают разбираться.

Вот мой код упрощен:

require 'csv' 

CSV::Converters[:my_converter] = lambda do |value| 
    value 
end 

CSV.open('new-data.csv', 'w') do |csv| 
    data = CSV.read('original-data.csv', :converters => [:my_converter]).each do |row| 
     csv << row 
    end 
end 

Значение 9/30/14 0:00 становится изменено на 9/30/2014 0:00, например.

+0

Какую версию Ruby вы используете? Как выглядит исходный файл примера? Вы уверены, что файл не содержит 2014? –

+1

Добро пожаловать в переполнение стека. Когда вы задаете вопрос о данных, крайне важно предоставить минимальные примеры данных, необходимые для дублирования проблемы. Без этого и требуемого формата вывода мы оставляем догадываться, в чем проблема. Прочтите «[ask]» и «[mcve]». –

ответ

1

Вы уверены, что ваш CSV-файл на самом деле не содержит 4-значный год? Попробуйте посмотреть на puts File.read('original-data.csv')

Когда я попробовал это на Руби 2.1.8, это не изменило значение

require 'csv' 

my_csv_data = 'hello,"9/30/14 0:00",world' 

CSV.new(my_csv_data).each do |row| 
    puts row.inspect # prints ["hello", "9/30/14 0:00", "world"], as expected 
end 
+0

Дерьмо, что ты прав! : facepalm: У оригинала было 2014. Записи, с которыми я сравнивал, были затронуты excel, по какой-то причине я предполагаю, что excel сделал форматирование с 2014 по 14. – yoyodunno

0

CSV файлы не разобранные и преобразуется в объекты, данные в полях возвращаются в строка. Всегда. Такое поведение отличается от YAML или JSON, которые преобразуются обратно в базовые типы.

Рассмотрим это:

require 'csv' 

CSV.parse("1,10/1/14,foo") # => [["1", "10/1/14", "foo"]] 

Все значения являются строками.

csv = ["foo", 'bar', 1, Date.new(2014, 10, 1)].to_csv # => "foo,bar,1,2014-10-01\n" 

Преобразование массива, содержащего собственные объекты Ruby, приводит к строке значений с разделителями-запятыми.

CSV.parse(csv) # => [["foo", "bar", "1", "2014-10-01"]] 

заново с этой строки возвращает строку версии, но не пытается вернуть их исходные типы в CSV не имеет возможности узнать, что это были. Разработчик (вы) должен знать и делать это.

Конечный результат всего, что CSV не изменит год от «14» до «2014». Он не знает, что это дата, и, поскольку это не CSV-место для преобразования в объекты, оно только разделяет поля соответствующим образом и передает информацию, которую нужно массировать разработчиком.

+0

«Данные в полях возвращаются в виде строки . Всегда "- за исключением того, что значение пустое, которое вернет нуль –