小槌へ移行(コード)
先日書いた、家計簿の移行に使ったコード。
エクスポートしたデータからdealsテーブルへインポートするデータを抽出しTSVで出力する
# TSV format # 1.type ("Deal") # 2.user_id (2) # 3.date # 4.daily_seq # 5.summary # pre_date = '' daily_seq = 0 ARGF.each do |line| items = ['Deal', '2'] rows = line.chomp.split(/\t/) date = rows[0] summary = rows[1] code = rows[2] plus = rows[3] minus = rows[4] if summary.size <= 0 next end date.gsub!(/(\d{4})(\d{2})(\d{2})/, '\1-\2-\3') if date == pre_date daily_seq += 1 else daily_seq = 1 pre_date = date end items << date items << daily_seq items << summary puts items.join("\t") end
エクスポートしたデータからdealsテーブルへインポートするデータを抽出しTSVで出力する
# # 1.usr_id (2) # 3.account_seq # 3.date # 4.daily_seq # 5.ammount # 6.out # 7.in # conv_entries = { '1101' => [41, 23], # 給与 '1102' => [42, 23], # 賞与 '1104' => [43, 23], # 雑収入 '1103' => [43, 23], # 年金 '1105' => [43, 23], # その他 '1201' => [23, 24], # 食費 '1202' => [23, 25], # 住居 '1203' => [23, 26], # 光熱・水道 '1204' => [23, 27], # 被服 '1205' => [23, 28], # 保健・医療 '1206' => [23, 39], # 教育 '1207' => [23, 33], # 教養・娯楽 '1208' => [23, 30], # 交際 '1209' => [23, 31], # 交通・通信 '1213' => [23, 37], # その他 } pre_date = '' daily_seq = 0 account_seq = 9 ARGF.each do |line| items = ['2'] rows = line.chomp.split(/\t/) date = rows[0] summary = rows[1] code = rows[2] plus = rows[4] minus = rows[5] date.gsub!(/(\d{4})(\d{2})(\d{2})/, '\1-\2-\3') unless conv_entries[code] next end if date == pre_date daily_seq += 1 else daily_seq = 1 pre_date = date end items << account_seq items << date items << daily_seq items << ((plus.to_i <= 0) ? minus : plus) items << conv_entries[code][0] items << conv_entries[code][1] account_seq += 1 puts items.join("\t") end
TSVデータを読み込んでdealsテーブルにデータをロードする
db = SQLite3::Database.new('kozuchi_development.db') sql = <<EOD INSERT INTO deals ( type, user_id, date, daily_seq, summary, confirmed, created_at, updated_at ) VALUES ( 'Deal', 2, :date, :daily_seq, :summary, 't', datetime('now', 'localtime'), datetime('now', 'localtime') ) EOD ARGF.each do |line| items = line.chomp.split(/\t/) date = items[2] daily_seq = items[3] summary = items[4] db.execute(sql, :date => date, :daily_seq => daily_seq, :summary => summary) end db.close
TSVデータを読み込んでaccount_entriesテーブルにデータをロードする
require 'sqlite3' db = SQLite3::Database.new('kozuchi_development.db') sql = <<EOD INSERT INTO account_entries (user_id, account_id, deal_id, amount, date, daily_seq) VALUES (2, :account_id, :deal_id, :amount, :date, :daily_seq) EOD ARGF.each do |line| items = line.chomp.split(/\t/) deal_id = items[1].to_i date = items[2] daily_seq = items[3].to_i amount = items[4].to_i ac_id_minus = items[5].to_i ac_id_plus = items[6].to_i db.execute(sql, :account_id => ac_id_minus, :deal_id => deal_id, :amount => (amount * -1), :date => date, :daily_seq => daily_seq) db.execute(sql, :account_id => ac_id_plus, :deal_id => deal_id, :amount => amount, :date => date, :daily_seq => daily_seq) end db.close
user_id はSQLに直に書いているので、TSVに出力しなくてもよかった。