0
0

More than 3 years have passed since last update.

【Rails】CSVを取り込み、計算し、画面に出力

Last updated at Posted at 2020-01-04

運営しているシステムの大幅回収にあたり、DBを移行しました。

その際あるテーブルのIDが連番になっていなかった部分を1から連番にしたのですが、関連するテーブル(1対多)のIDを1つずつ手動で変更するには量が膨大すぎたので、IDの値を簡単に変更するためのプログラムを組んだので内容を記録します。

プログラムの内容

・webページ上でCSVファイルをアップロード
・受け取ったファイルの各行1列目(一番左の項目)を配列に保存する
・数値を確認し、値ごとに計算を行う(42~117の間の数値だった場合-10、など)
・計算後の数値を画面に出力

画面に出力された数値をコピペすることで、手元のCSVのIDを一括で修正することが出来ます。

実装

app/controllers/csv_controller.rb
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)に変えると動くことがある。

app/views/csv/input.html.erb
<%= form_with url: csv_path, local: true do |f| %>
  <%= f.file_field :file %>
  <%= f.submit %>
<% end %>
app/views/csv/output.html.erb
<% @a.each do |i| %>
<p><%= i %></p>
<% end %>
app/config/routes.rb
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|が使える
・コントローラー名を単数形にしてしまったが、普通に動いた。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0