🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1358閲覧

rubyでcsvファイルをインポートして一括でユーザー登録したい。

jun3030

総合スコア16

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1グッド

1クリップ

投稿2019/12/27 14:11

編集2019/12/27 14:19

前提・実現したいこと

rubyでcsvファイルをインポートして一括でユーザー登録したいです

csvついてどうしても分からず質問致します。申し訳ないのですがご教授頂けないでしょうか。。

初めてcsvインポートを実装と言う事で以下のサイトを参考に全く同じコードを記述しました。
参考文献

googleスプレットシートからcsvファイルを作成し、indexページからファイルを選択し、インポートしようとした際に以下のエラーが出ます。

発生している問題・エラーメッセージ

Invalid byte sequence in UTF-8 in line 1.

該当のソースコード

index.html.erb

1index.html.erb 2 3 4<h1>ユーザー一覧</h1> 5 6<table> 7 <thead> 8 <tr> 9 <th>ID</th> 10 <th>名前</th> 11 <th>年齢</th> 12 </tr> 13 </thead> 14 15 <tbody> 16 <% @users.each do |user| %> 17 <tr> 18 <td><%= user.id %></td> 19 <td><%= user.name %></td> 20 <td><%= user.age %></td> 21 </tr> 22 <% end %> 23 </tbody> 24</table> 25 26<%= form_tag import_users_path, multipart: true do %> 27 <%= file_field_tag :file %> 28 <%= submit_tag "インポート" %> 29<% end %>

index.html.erb

1class UsersController < ApplicationController 2 3 def index 4 @users = User.all 5 end 6 7 def import 8 # fileはtmpに自動で一時保存される 9 User.import(params[:file]) 10 redirect_to users_url 11 end 12end

index.html.erb

1class User < ApplicationRecord 2 3 require 'csv' 4 5 def self.import(file) 6 CSV.foreach(file.path, headers: true, ) do |row| 7 # IDが見つかれば、レコードを呼び出し、見つかれなければ、新しく作成 8 user = find_by(id: row["id"]) || new 9 # CSVからデータを取得し、設定する 10 user.attributes = row.to_hash.slice(*updatable_attributes) 11 # 保存する 12 user.save 13 end 14 end 15 16 # 更新を許可するカラムを定義 17 def self.updatable_attributes 18 ["id", "name", "age"] 19 end 20end

index.html.erb

1application.rb 2 3require_relative 'boot' 4 5require 'rails/all' 6require 'csv' 7 8

試したこと

文字コードを変更する際にエラーが出ている。変換の仕方に問題があるとなんとなく検索して原因は分かったのですが(違っていたらすいません)どのように記述すれば変換がうまく行くのか分かりません。

CSV.foreach(file.path, headers: true, ) do |row|
⬇︎
CSV.table(file.path, headers: true, encoding: "SJIS:UTF-8") do |row|

検索した結果 csvはshift-jisで設定すれば上手く行くと書いてあったので
encoding: "SJIS:UTF-8"と付け加えてみましたが改善されませんでした、、

大変申し訳ありませんが何かアドバイス頂けないでしょうか、、汗

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KazuSaka

2019/12/27 14:48

"SJIS:UTF-8" ➡︎ 'Shift_JIS:UTF-8' に変更したらどうですか? スプレッドシートで作ったcsvは文字化けしてませんか?メモ帳等で開いた時。
jun3030

2019/12/27 15:04

遅い時間帯にも関わらず回答ありがとうございます!汗 'Shift_JIS:UTF-8'に変更したところ "\x99" followed by "\x10" on Shift_JIS とエラーが返ってきました汗 メモ帳で読み込んだところ、 id,name,age 2,test,10 このように返ってきました。これは問題は特にないという事ですかね。。
KazuSaka

2019/12/27 16:24

CSVの内容は良いと思います。 メモ帳の「名前を付けて保存」を開いて、文字コード確認できますでしょうか? 質問者さんが参考にされたページ通りに実装したら、私の環境では正常動作しました。 グーグルスプレッドシートでCSV作成・ダウンロードしましたが、文字コードはUTF-8で作成されてました。
jun3030

2019/12/27 17:02

わざわざ試して下さったんですね、、汗 すいません。文字コードの確認とはどういったものでしょうか。。 タイトルの最後の形式の事でしょうか?汗 タイトル:testtest.csv - シート1 (5).csv 出来たということは私の記述の仕方の何処かが間違っているという事ですね。 コピペで全て貼り付けてやったので怪しいのはcsvファイルの作り方に問題でもあるのかと思っていたのですが汗
jun3030

2019/12/27 17:20

時間がかかってしまいすいません汗 macを使っているのですが、元々入っているメモアプリとテキストエディットというアプリでは名前をつけて保存が出来ないみたいで手間取ってます。 必要なら別のアプリを探して確認してみます!
KazuSaka

2019/12/27 17:57 編集

勝手にWindowsだと思い込んでました… すいません。 CSVの文字コードがUTF-8でしたら、いいと思うんですが….
jun3030

2019/12/27 18:02 編集

なんとか確認出来ました。遅くなってすいません!汗 file:///Users/matsumotoshun/Desktop/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202019-12-28%202.55.40.png 画像みれますでしょうか汗 標準テキストのエンコーディング: Unicode(UTF-8)になっていました!
KazuSaka

2019/12/27 18:04

アップしてもらった画像が見えません. ローカルのURLっぽいですが fileではじまってるので…
KazuSaka

2019/12/27 18:14 編集

でしたら、問題なさそうですね! 私的にはギブアップです???? 何か気づいたら、連絡します! ちなみに、rubyとrailsのバージョンは?
jun3030

2019/12/27 18:25

すいません。なんとかスクショを送ろうと頑張っているのですが、、 Rails version: 5.1.7 Ruby version: 2.6.3 (x86_64-linux) 遅くまで本当にすいません!汗 ここまで考えてくださっただけでも感謝しかありません! kazuさんは参考文献通りにしたら出来たので、何かおかしいところがないか探ってみます。
KazuSaka

2019/12/27 18:31

ソースと異なるところが2点ありましたので、一応伝えときます。動作には問題無さそうです。 user.rb内のrequire 'csv'は不要です。 user.rb内のCSV.foreach(file.path, headers: true, )のtrueの後のカンマは不要です。
jun3030

2019/12/28 11:47

ご指摘ありがとうございます! 今日別のパソコン(windows)でスプレットシートからcsvファイルを作りインポートしたところあっさり出来ました。 どうやらcsvファイルの方に問題があったみたいです、、 拡張子を確認したところ両方csvになってますし何故なんでしょうね、、汗
KazuSaka

2019/12/28 13:31

そうなんですね! 解決してよかったです!
guest

回答1

0

ベストアンサー

とりあえずはCSVの問題というより 文字コードをなんとか ということですね。
CSVがUTF-8でできていれば問題なさそうですが、グーグルスプレッドシートでCSV作成・ダウンロードしたところKazuSakaさんとことなり shif-jisでした。
どこか設定があるのか、、、みつからなかった。
で、
shft-jisなCSVをどう扱うか。いくつかやり方はあります

  1. "SJIS:UTF-8" でなく "Windows-31J:UTF-8" で試してください
  2. CSV.parse(NKF.nkf("-w",(File.read(file.path)))).each{|row|
  3. nkf があれば 予め nkf -w sjis_csvfile > utf_csvfile しておく
  4. LibreOfficeで読んでUTF-8 な CSVで書き出す

投稿2019/12/28 10:10

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jun3030

2019/12/28 16:19

回答して下さりありがとうございます! 1) "SJIS:UTF-8" でなく "Windows-31J:UTF-8" で試したところmacでも無事にインポートすることができました! 他はまだ試せてはいませんが、今後万が一①の方法で出来なければ、違う方法も試してみたいと思います! 回答して下さったお二人には本当に感謝しかないです汗 今後も精進して参ります!
winterboum

2019/12/28 21:45

良かったです。 ったくMicrosoftには泣かされます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問