運営しているシステムの大幅回収にあたり、DBを移行しました。
その際あるテーブルのIDが連番になっていなかった部分を1から連番にしたのですが、関連するテーブル(1対多)のIDを1つずつ手動で変更するには量が膨大すぎたので、IDの値を簡単に変更するためのプログラムを組んだので内容を記録します。
プログラムの内容
・webページ上でCSVファイルをアップロード
・受け取ったファイルの各行1列目(一番左の項目)を配列に保存する
・数値を確認し、値ごとに計算を行う(42~117の間の数値だった場合-10、など)
・計算後の数値を画面に出力
画面に出力された数値をコピペすることで、手元のCSVのIDを一括で修正することが出来ます。
実装
class CsvController < ApplicationController
require "csv"
def input; end
def output
file = params[:file]
@a = Array.new
CSV.foreach(file) do |i|
b = i[0].to_i
if b
@a.push(b)
end
end
@a.each_with_index do |value, index|
if value.between?(5,8)
@a[index] -= 4
elsif value.between?(12,28)
@a[index] -= 7
elsif value.between?(31,40)
@a[index] -= 9
elsif value.between?(42,117)
@a[index] -= 10
elsif value.between?(119,300)
@a[index] -= 11
end
end
end
end
CSV.foreach(file)
で動かない時にはCSV.foreach(file.path)
に変えると動くことがある。
<%= form_with url: csv_path, local: true do |f| %>
<%= f.file_field :file %>
<%= f.submit %>
<% end %>
<% @a.each do |i| %>
<p><%= i %></p>
<% end %>
Rails.application.routes.draw do
get '/csv', to:'csv#input'
post '/csv', to:'csv#output'
.
.
学んだこと
・require "csv"
をコントローラー内に書き込むことで、CSV.foreach
等のメソッド?群が使えるようになる。
・between?(12,28)
というメソッドで、変数に格納されている数値が12以上28以下かどうかを確認することができる
・ファイルの送信はf.file_field :file
、受け取りはparams[:file]
でできる。
→Strong Parametersは、DBに値を保存するとき以外は、使わなくてもエラーは発生しない
・配列内の値を編集し、再度代入する時にはeach_with_index do |value, index|
が使える
・コントローラー名を単数形にしてしまったが、普通に動いた。