2015-05-16 3 views
0

Это случай неудачных входных данных, я думаю.Сохранение пробелов при записи файла в csv

Задать файл как можно найти here, как я могу сохранить необходимые пробелы, как в ссылке? Когда я разбираю это, используя приведенный ниже код, последний ряд уплотняется, сдвигая его влево - и даты становятся сумасшедшими (февраль получает 31 день, но декабрь этого не делает).

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

код выглядит следующим образом:

#!/usr/bin/env ruby 

require 'open-uri' 
require 'csv' 

class MoonDataSeeder 

    def initialize(year = nil) 
    @year = year || Time.now.year 
    end 

    def seed 
    convert_to_csv 
    end 

    private 

    def convert_to_csv 
    CSV.open('test_file', 'wb', :force_quotes => true, :skip_blanks => false) do |csv| 
     feed_data.lines[-39..-7].each do |row| 
     csv << row.split 
     end 
    end 
    end 

    def feed_data 
    @feed_data ||= open(feed_uri).read 
    end 

    def feed_uri 
    host = "http://aa.usno.navy.mil/cgi-bin/aa_moonill2.pl" 
    host + "?form=2&year=#{year}&task=00&tz=0&tz_sign=-1" 
    end 

    def year 
    @year 
    end 

end 

ответ

1

То, что вы действительно делаете разбор равноширинные данных, а не с разделителями данных (ну, может быть, он имел обыкновение быть вкладки, но теперь это бесполезные пространства). Вместо этого попробуйте использовать fixedwidth gem.

Или, я просто сделаю это вручную. Это работает на линиях, содержащих данные:

data = lines.map do |line| 
    line.strip! 
    [].tap do |pieces| 
    pieces << line.slice!(0, 3) # Day 
    line.slice!(0, 4)    # Space 
    until line.empty? 
     pieces << line.slice!(0, 4) # Month 
     line.slice!(0, 5)   # Space 
    end 
    end.map(&:strip) 
end 

И просто для удовольствия, вот версия с использованием регулярных выражений

data = lines.map do |line| 
    line.scan(/([\w. ]{4})({4,5})?/).map(&:first) 
end 
+0

это здорово! спасибо за ваш вклад :) – dax