質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.37%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby

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

Ruby on Rails 6

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

Ruby on Rails

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

Q&A

解決済

2回答

4803閲覧

railsアプリから出力したCSVファイルの値が0落ちしたり、文字列が数値になってしまう

GenkiSugiyama

総合スコア86

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby

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

Ruby on Rails 6

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/08/31 07:24

編集2020/08/31 10:50

railsアプリで登録されたユーザー情報をCSVファイルへ出力する機能を実装しようとしています。

csvの出力自体は行えたのですが、実際のファイルをmacのNumbersで開いてみると表題の問題が起こっています。(windowsのExcelも同様)
具体的には、電話番号や郵便番号の頭の「0」が表示されない状態です。(元データはハイフン無しの文字列ですが、開く際に勝手に数値に変換されている??)

テキストエディタ出力ファイルを確認すると、0落ちせず「"08011112222"」のような形で出力されています。

これは、出力する側で制御可能なのでしょうか?

制御可能であれば0落ちを防ぐための対策を教えていただけますと助かります。

【出力方法】
app/models/user.rb

user.rb

1def self.csv_attributes 2 ["name", "tel", "email", "post_code", "prefectures", "address_1", "address_2", "room_number", "created_at", "updated_at"] 3end 4 5def self.generate_csv 6 csv_columns = ["名前", "電話番号", "メールアドレス", "郵便番号", "都道府県", "住所1", "住所2", "住所3", "登録日時", "最終更新日時"] 7 CSV.generate(encoding: Encoding::SJIS, row_sep: "\r\n", force_quotes: true) do |csv| 8 csv << csv_columns 9 all.each do |user| 10 csv << csv_attributes.map{ |attr| user.send(attr) } 11 end 12 end 13end

usersのindexのビューにエクスポートボタンを設置

app/controllers/users_controller.rb

def index @users = User.all respond_to do |format| format.html format.csv { send_data @users.generate_csv, filename: "users-#{Time.zone.now.strftime("%Y%m%d%S")}.csv" } end end

【テーブル情報】

create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "name" t.string "tel" t.string "email" t.string "post_code" t.string "prefectures" t.text "address_1" t.text "address_2" t.string "room_number" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end

##試してみたこと
app/models/user.rb内のself.attributes内で属性名を取り出すのではなく値を直接取り出して、0落ちしてしまう値に対してこちらで紹介されている0落ち対策を行おうとしましたが、NoMethodErrorとなりました。

app/models/user.rb

def self.csv_attributes [self.name, %Q{="#{self.tel}"}, self.email, %Q{="#{self.post_code}"}, self.prefectures, %Q{="#{self.address_1}"}, %Q{="#{self.address_2}"}, %Q{="#{self.room_number}"}, self.created_at_date, self.updated_at_date, self.orders_counts, self.order_rackets_counts, self.order_amounts] end def self.generate_csv csv_columns = ["名前", "電話番号", "メールアドレス", "郵便番号", "都道府県", "住所1", "住所2", "住所3", "登録日時", "最終更新日時"] CSV.generate(encoding: Encoding::SJIS, row_sep: "\r\n", force_quotes: true) do |csv| csv << csv_columns all.each do |user| # csv << csv_attributes.map{ |attr| user.send(attr) }         csv << csv_attributes end end end

【エラー画面】
イメージ説明

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

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

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

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

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

guest

回答2

0

画像添付されているエラーは、def self.csv_atrrivutes とclass methodにしているからです。
def csv_attributes とし、def self.generate_csv ではcsv << user.csv_attributes とすれば通ります。

ただ、、、

何のためにCSVに書きだしているのか、によります。
ExcelやNumbersで開いて人間が 0が付いてるな、と見るのでしたらそれで良いかと思いますが、データ交換としてのCSVでは、まずいことになるかも、と思います。
受け手が '090-1234-5678' を期待しているところに '="090-1234-5678"' が届きます。これRailsで受けると”電話番号にハイフンと数字以外の文字(ダブルコーテーションと=)がある、ということでvalidationエラーとなるでしょう。
データ交換目的の場合は「表言語で開くな!」です。

投稿2020/08/31 12:39

winterboum

総合スコア23549

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

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

GenkiSugiyama

2020/09/02 06:58

毎度詳細でご丁寧なご回答ありがとうございます! メソッドにもクラスメソッドとインスタンスメソッドがあることすら知らなかったので大変参考になりました。 ご指摘いただいたようにメソッド名を変更したところ動いてくれました。 また、データ交換用の出力についての注意事項も参考にさせていただきますm(_ _)m 今回は閲覧用だったのでこのまま実装しますが、データ交換用に出力する際は気をつけます!
guest

0

ベストアンサー

CSVの0落ち問題は、かなり困りますよね。
=("")でエクスポートできればExcelなどで0落ちせずに読み込むことができるはずです。
https://gsuiteguide.jp/sheets/guide-display_first_zero/

Railsではやったことがないですが、下記が参考になるかと思います。
https://qiita.com/shunichi_com/items/bfcd30a10aa1bd5ce4c1

投稿2020/08/31 07:35

no1knows

総合スコア3365

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

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

GenkiSugiyama

2020/09/02 06:59

ご回答いただきありがとうございます。 紹介いただいた0落ち対応を実装したメソッドが上手く動いた結果、出力ファイルで0落ち対策が上手く効いてたのが確認できたのでベストアンサーとさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問