Rake任务下载和解压缩

Col*_*tel 6 ruby rake ruby-on-rails unzip

我想每周更新一个城市表,以反映世界各地城市的变化.我正在为此目的创建一个Rake任务.如果可能的话,我想这样做而不添加另一个gem依赖项.

压缩文件是geonames.org/15000cities.zip上公开提供的压缩文件.

我的尝试:

require 'net/http'
require 'zip'

namespace :geocities do
  desc "Rake task to fetch Geocities city list every 3 days"
  task :fetch do

    uri = URI('http://download.geonames.org/export/dump/cities15000.zip')
    zipped_folder = Net::HTTP.get(uri) 

    Zip::File.open(zipped_folder) do |unzipped_folder| #erroring here
      unzipped_folder.each do |file|
        Rails.root.join("", "list_of_cities.txt").write(file)
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

从...返回 rake geocities:fetch

rake aborted!
ArgumentError: string contains null byte
Run Code Online (Sandbox Code Playgroud)

详细说明,我正在尝试解压缩文件并将其保存到list_of_cities.txt文件中.一旦我完成了这个方法,我相信我可以找出如何根据文件更新我的数据库.(但是如果你对如何最好地处理实际数据库更新有意见,除了我计划的方式,我很乐意听到它们.但这似乎完全不同.)

Omi*_*gar 5

这将保存zipped_folder到磁盘,然后解压缩并保存其内容:

require 'net/http'                                                              
require 'zip'                                                                   

namespace :geocities do                                                         
  desc "Rake task to fetch Geocities city list every 3 days"                    
  task :fetch do                                                                

    uri = URI('http://download.geonames.org/export/dump/cities15000.zip')                          
    zipped_folder = Net::HTTP.get(uri)                                          

    File.open('cities.zip', 'wb') do |file|                                      
      file.write(zipped_folder)                                                 
    end                                                                         

    zip_file = Zip::File.open('cities.zip')                                     
    zip_file.each do |file|                                                     
      file.extract
    end                                                                         
  end                                                                           
end
Run Code Online (Sandbox Code Playgroud)

在这种情况下,这将提取zip文件中的所有文件cities15000.txt
然后,您可以读取其中的内容cities15000.txt并更新数据库。

如果要解压缩为其他文件名,则可以将其传递为file.extract

zip_file.each do |file|                                                     
    file.extract('list_of_cities.txt')
end 
Run Code Online (Sandbox Code Playgroud)