remote_path: pub/test
retry: 3
host: 192.168.1.70
username: anonymous
password: anonymous
get_ftp.rb
sample usage: # ruby get_ftp.rb index_hist
will get 'index_hist.gz' from ftp and gunzip it to index_hist
require 'net/ftp' require 'yaml' cnt_retry = 0 puts "start process..." begin ftp_cfg = YAML.load_file("ftp.yml") fn = ARGV[0] ftp = Net::FTP.open(ftp_cfg["host"]) ftp.login(ftp_cfg["username"],ftp_cfg["password"]) ftp.chdir(ftp_cfg["remote_path"]) puts "getting #{fn}.gz from FTP for attempt #{cnt_retry}..." ftp.getbinaryfile("#{fn}.gz") system("gunzip -f #{fn}.gz") ftp.close rescue => err if cnt_retry + 1 < 3 cnt_retry += 1 sleep 5 retry else raise err log.error "There was an error: #{err.message}" end else puts "Job done." endimport to a mysql database db.yml
host: 192.168.1.70
username: kagen
password: kagen
database: db_development
import_indices.rbsample usage1: # ruby import_indices.rb master index_master
will import data from index_master into table 'indices'
sample usage2: # ruby import_indices.rb hist index_hist
will import data from index_hist into table 'index_value_hist'
require 'yaml' require 'kconv' require 'mysql' puts "start process of data import..." begin my = Mysql::init() db_cfg = YAML.load_file("db.yml") if ARGV[0] == "master" tbl = "indices" fld = "(itemcode, jpname, engname, jpsourcename, engunitname, unit, decimalpoint, startmonth, updated_at)" else tbl = "index_value_hist" fld = "(itemcode, subcode, cycle, yyyy, mm, dd, val, updated_at)" end puts "Connecting to host #{db_cfg["host"]} with user #{db_cfg["username"]} using database #{db_cfg["database"]}..." my.real_connect(db_cfg["host"], db_cfg["username"], db_cfg["password"], db_cfg["database"]) puts "Connected Successfully" my.query("SET AUTOCOMMIT=0") puts "Start transaction..." my.query("START TRANSACTION") if ARGV[0] == "master" puts "Processing Index master" elsif ARGV[0] == "hist" puts "Processing Index values history" end begin File.open(ARGV[1]) do |f| f.each_line do |row| sql = nil rows = row.split(":") #puts rows.inspect if ARGV[0] == "master" sql = "INSERT INTO #{tbl} #{fld} VALUES('#{rows[0]}', '#{rows[1].toutf8}', '#{rows[2]}', '#{rows[3].toutf8}', '#{rows[4].toutf8}', '#{rows[5]}', '#{rows[6]}', '#{rows[7]}', CURRENT_TIMESTAMP)" elsif ARGV[0] == "hist" if rows[3] == "D" if rows[0].strip == "DEL" sql = "DELETE FROM #{tbl} WHERE itemcode = '#{rows[1].strip}' AND subcode = '#{rows[2].strip}' AND cycle = 'D' AND yyyy = '#{rows[4][0..3]}' AND mm = '#{rows[4][4..5]}' AND dd = '#{rows[4][6..7]}'" elsif rows[0].strip == "UPD" sql = "INSERT INTO #{tbl} #{fld} VALUES('#{rows[1].strip}', '#{rows[2].strip}', 'D', '#{rows[4][0..3]}', '#{rows[4][4..5]}', '#{rows[4][6..7]}', '#{rows[5]}', CURRENT_TIMESTAMP)" end elsif rows[3] == "M" if rows[0].strip == "DEL" sql = "DELETE FROM #{tbl} WHERE itemcode = '#{rows[1].strip}' AND subcode = '#{rows[2].strip}' AND cycle = 'D' AND yyyy = '#{rows[4][0..3]}' AND mm = '#{rows[4][4..5]}'" elsif rows[0].strip == "UPD" sql = "INSERT INTO #{tbl} #{fld} VALUES('#{rows[1].strip}', '#{rows[2].strip}', 'M', '#{rows[4][0..3]}', '#{rows[4][4..5]}', '', '#{rows[5]}', CURRENT_TIMESTAMP)" end end end if sql #puts sql my.query(sql) end end end my.query("COMMIT") rescue => err puts "rollback changes..." my.query("ROLLBACK") raise err log.error "There was an error while insert db: #{err.message}" end rescue => err raise err log.error "There was an error: #{err.message}" else puts "Job done." endcreate tabless
CREATE TABLE `indices` (
`itemcode` varchar(15) NOT NULL ,
`jpname` varchar(30) NOT NULL ,
`engname` varchar(28) NOT NULL ,
`jpsourcename` varchar(32) NOT NULL ,
`jpunitname` varchar(30) NOT NULL ,
`engunitname` varchar(30) NOT NULL ,
`unit` int(8) NOT NULL ,
`decimalpoint` int(8) NOT NULL ,
`startmonth` int(8) NOT NULL ,
`updated_at` datetime NOT NULL ,
PRIMARY KEY (`itemcode`)
) type=InnoDB;
CREATE TABLE `index_value_hist` (
`itemcode` varchar(15) NOT NULL ,
`subcode` varchar(5) NOT NULL ,
`cycle` varchar(1) NOT NULL ,
`yyyy` varchar(4) NOT NULL ,
`mm` varchar(2) NOT NULL ,
`dd` varchar(2) NOT NULL ,
`val` double(24,7) NOT NULL ,
`updated_at` date NOT NULL ,
PRIMARY KEY (`itemcode`, `subcode`, `cycle`, `yyyy`, `mm`, `dd`)
) type=InnoDB;
Sample Data to import (EUC, LF) No title row ☆index_value_hist only☆
UPD :AREGEN :A :M:201212:150463.7400000:20121218
UPD :AREGEN :C :M:201212:158030.9800000:20121218
UPD :AREGEN :C :W:2012124:158030.9800000:20121218
UPD :AREGEN :H :M:201212:158030.9800000:20121218
...
0 件のコメント:
コメントを投稿