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文件中.一旦我完成了这个方法,我相信我可以找出如何根据文件更新我的数据库.(但是如果你对如何最好地处理实际数据库更新有意见,除了我计划的方式,我很乐意听到它们.但这似乎完全不同.)
这将保存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)