项目开发的过程中,经常遇到以下的情况:
1. 从 Txt,CSV 或者 Excel 文档中,导入数据至数据库;
2. 数据库内的原始数据,经过计算后,导出给运营,营销同事;
3. 程序自动导入运营人员收集的图片;
4. 自动根据中文地址,收集 GEO 经纬度坐标数据:纬度 latitude & 经度 longitude 等
namespace :school do
desc "manually load excel data"
task :load => :environment do
puts "Start manually load excel data"
file = "#{Rails.root}/doc/schools.xls"
data = Spreadsheet.open file
sheet1 = data.worksheet 0
sheet1.each_with_index do |row, row_index|
name = row[0]
address = row[1].to_s.strip
if row[2].present? && row[2] != '\\N'
phone = row[2]
end
end
puts "End manually load excel data"
end
end
end
csv_file = File.new("#{Rails.root}/doc/schools.csv", "w")
$\ = "\n";
csv_file.print("id,name,address,phone")
schools = School.find_in_batches do |groups|
groups.each do |school|
csv_file.print("\"#{school.id}\",\"#{school.name}\",\"#{school.address}\",\"#{school.phone}\"")
end
end
file = File.open("#{Rails.root}/doc/missing_names.txt", 'w')
School.where("name is null or name = ''").all.each do |school|
file.puts school.id
end
file.close
image_path = "#{Rails.root}/app/assets/images/school_logos"
Dir.chdir(image_path)
image_files = Dir.glob("*")
count = 0
image_files.each do |file_name|
len = file_name.rindex('.')
code = file_name[0,len]
puts "image file code #{code}"
schools = School.where(code: code).all
schools.each do |school|
if school
count += 1 if school.refresh_logo(file_name.to_s)
end
end
end
puts "Successfully update #{count}"
namespace :geo do
desc "load school geo data"
task :load => :environment do
puts "Start load school geo data"
start_id = ENV["start_id"]
schools = School.where("id > ?", start_id).where("lat < 1").order("id").limit(1000)
puts "total school count #{schools.size}"
schools.each do |school|
puts "process #{school.name} #{school.addr}"
url = "http://maps.googleapis.com/maps/api/geocode/json?language=zh-CN&sensor=false&address=#{school.addr}"
resp_data = fetch_geocode(url)
parse_school_geocode(school, resp_data) if resp_data
sleep(rand(5))
end
puts "End load school geo data"
end
def parse_school_geocode(school, resp_data)
json_data = JSON.parse(resp_data.body)
results = json_data["results"][0]
if results.present?
params = {}
location = results["geometry"]["location"]
params[:lat] = location["lat"] if location["lat"].present?
params[:lng] = location["lng"] if location["lng"].present?
if params.size > 0
school.update_attributes(params)
puts "update #{school.id} params #{params.inspect}"
end
end
end
def fetch_geocode(url)
begin
response = Net::HTTP.get_response(URI.parse(URI.encode(url)))
rescue
puts "INVALID URL: #{url}"
end
case response
when Net::HTTPSuccess then response
else
nil
end
end
end
2015-10-04