下载和解压缩 Rake 任务
Rake task to download and unzip
我想每周更新一个城市table来反映世界各地城市的变化。为此,我正在创建一个 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
来自rake geocities:fetch
的return
rake aborted!
ArgumentError: string contains null byte
详细说明,我正在尝试解压缩文件并将其保存到 list_of_cities.txt 文件中。一旦我了解了完成此操作的方法,我相信我可以根据该文件弄清楚如何更新我的数据库。 (但如果您对如何最好地处理实际数据库更新有意见,而不是我计划的方式,我很乐意听取他们的意见。但这似乎完全不同 post。)
这会将 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
这将提取 zip 文件中的所有文件,在本例中为 cities15000.txt
。
然后您可以阅读 cities15000.txt
的内容并更新您的数据库。
如果你想解压到不同的文件名,你可以像这样将它传递给file.extract
:
zip_file.each do |file|
file.extract('list_of_cities.txt')
end
我认为没有 ruby 可以更容易地完成,只需使用 wget
和 unzip
:
namespace :geocities do
desc "Rake task to fetch Geocities city list every 3 days"
task :fetch do
`wget -c --tries=10 http://download.geonames.org/export/dump/cities15000.zip | unzip`
end
end
我想每周更新一个城市table来反映世界各地城市的变化。为此,我正在创建一个 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
来自rake geocities:fetch
rake aborted!
ArgumentError: string contains null byte
详细说明,我正在尝试解压缩文件并将其保存到 list_of_cities.txt 文件中。一旦我了解了完成此操作的方法,我相信我可以根据该文件弄清楚如何更新我的数据库。 (但如果您对如何最好地处理实际数据库更新有意见,而不是我计划的方式,我很乐意听取他们的意见。但这似乎完全不同 post。)
这会将 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
这将提取 zip 文件中的所有文件,在本例中为 cities15000.txt
。
然后您可以阅读 cities15000.txt
的内容并更新您的数据库。
如果你想解压到不同的文件名,你可以像这样将它传递给file.extract
:
zip_file.each do |file|
file.extract('list_of_cities.txt')
end
我认为没有 ruby 可以更容易地完成,只需使用 wget
和 unzip
:
namespace :geocities do
desc "Rake task to fetch Geocities city list every 3 days"
task :fetch do
`wget -c --tries=10 http://download.geonames.org/export/dump/cities15000.zip | unzip`
end
end