KEN_ALL.CSVのインポートスクリプト

こんな感じで良いのかなぁ…
railsRakefile にかいた。

task :import_zip do
 	|t|

  require "nkf"
  require "csv"
  require "generator"
  require File.dirname(__FILE__) + "/config/environment"

  ZipCode.delete_all

	Fields = %W[local_authority_id old_code code prefecture_kana city_kana town_kana prefecture city town divided koaza cho multi updated reason_of_update].join(',')

	gen = Generator.new do
		|g|

		counter = 0

		open(File.dirname(__FILE__) + "/public/KEN_ALL.CSV").each do 
			|line|
			counter += 1

			values = NKF.nkf("-w -S", line).split(',').map {|it| it.delete('"') } .map {|it| ActiveRecord::Base.quote(it) }.join(',')
			ActiveRecord::Base.connection.execute("insert into zip_codes (#{Fields}) values(#{values}) ")

			if counter % 100 == 0
				print "\r#{counter}" 
				STDOUT.flush
			end

			if counter % 1000 == 0
				g.yield false
			end
		end
	end

	while gen.next? do
		ZipCode.transaction do
			|tr|
			gen.next
		end
	end

	puts "糞仕様のフォローをするよ!"
	ZipCode.count(:id, :group => "code", :having => "count(id) > 1", :conditions => "multi = 0").each do
		|code, id|
		records = ZipCode.find(:all, :conditions => ['code = ?', code], :order => 'id')

		first_record = records.first
		first_record.town = records.inject("") {|r, v| r + v.town }
		first_record.save!

		ZipCode.delete_all(['id in (?)', records[1, records.size].map {|it| it.id }])
	end

end