我认为这是一个不幸的输入数据。
鉴于可以找到here的文件,我如何在链接中保留必要的空格?当我使用下面的代码解析它时,最后一行通过向左移动来压缩 - 日期变得棘手(2月变为31天,但12月没有)。
我知道代码完全正如我所说的那样。它在白色空间分裂。它应该保持一定数量的行,但由于没有分隔字符,我不知道如何询问我想要的东西!
代码如下:
#!/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
答案 0 :(得分: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