在将文件写入csv时保留空格

时间:2015-05-16 11:37:39

标签: ruby csv

我认为这是一个不幸的输入数据。

鉴于可以找到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

1 个答案:

答案 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