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

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

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

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

Ruby

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

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Ruby on Rails

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

Q&A

解決済

2回答

1125閲覧

RubyのCSVインポート機能で1列目を読み込む

shimazu

総合スコア38

CSV

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

Ruby

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

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Ruby on Rails

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

0グッド

0クリップ

投稿2018/12/26 05:19

編集2018/12/26 06:59

#やりたいこと
RailsアプリでCSVをDBにインポートしたいのですが、以下のコードではCSVの1列目が読み込まれません。
どうすればいいでしょうか?

#できていること
1列目以外はDBに読み込めます。
以下のコードでは1列目のAAA以外は読み込めます。

rb

1 2class SampleModel < ApplicationRecord 3 # 使用するライブラリを読み込む 4 require 'kconv' 5 require 'csv' 6 7 HEADER_TO_SYM_MAP = { 8 'AAA' => :aa_no, 9 'BBB' => :bb_no, 10 } 11 UTF8_CONVERTER = ->(field) { field.encode('utf-8', invalid: :replace, undef: :replace, replace: "") } 12 13 def self.import(file) 14 self.all.delete_all 15 header_converter = lambda { |h| HEADER_TO_SYM_MAP[h] } 16 CSV.foreach(file.path, encoding: "Shift_JIS", headers: :first_row, header_converters: header_converter, skip_blanks: true) do |row| 17 sample_model = new 18 sample_model.aa_no = row[:aa_no], 19 sample_model.bb_no = row[:bb_no], 20 kanzi_question.save! 21 end 22 end 23end

#環境
・Mac
・csv:Numbersから生成

#追記

NumbersからCSVを生成すると、1行目と1列目がヘッダー扱いになっているのかも?
どんな状態であろうと1列目は無条件で読み込みたいです。
イメージ説明

#lessコマンド画像
イメージ説明

#BOMの調査
ターミナルで$file 表1.csvを実行しました

表1.csv: Non-ISO extended-ASCII text, with CRLF, NEL line terminators

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

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

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

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

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

guest

回答2

0

自己解決

rb

1 self.all.delete_all 2 header_converter = lambda { |h| HEADER_TO_SYM_MAP[h] } 3 CSV.foreach(file.path, encoding: "Shift_JIS", headers: :first_row, header_converters: header_converter, skip_blanks: true) do |row| 4 sample_model = new 5 sample_model.aa_no = row[:aa_no] #ここの,がいらなかった 6 sample_model.bb_no = row[:bb_no] #ここ 7 kanzi_question.save! 8 end

投稿2018/12/26 07:11

shimazu

総合スコア38

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

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

0

CSV.foreach(file.path, encoding: "Shift_JIS", headers: :first_row, header_converters: header_converter, skip_blanks: true) do |row|

上記でheaders: :first_rowを指定しているため、1行目をヘッダ行として取り扱うようになっています。上記オプションを指定しなければ、1行目からデータとして読み込まれると思います。

https://docs.ruby-lang.org/ja/latest/method/CSV/s/new.html

投稿2018/12/26 05:29

kazto

総合スコア7196

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

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

shimazu

2018/12/26 05:37

一行目から読み込みたいのではなく、一列目から読み込みたいんです
kazto

2018/12/26 05:58

失礼しました。 そうなるとcsvファイルの内容次第になります。 csvファイルの内容を先頭数行分でも追記いただけますでしょうか。
shimazu

2018/12/26 06:03

追記しました。 Numbersの性質なのか、生成したCSVは必ず1行目、1列目がヘッダー扱い(?)となるとようです。
kazto

2018/12/26 06:20

CSVファイルをテキストファイルとして開く(lessコマンドなどで見る)とどうなりますか? ヘッダ行の'AAA'が、' AAA'のようにスペースが入るなどして、うまく変換できていない可能性を危惧しています。
shimazu

2018/12/26 06:28

特にそのような問題はありません。
kazto

2018/12/26 06:33

無い、と決めつけるのはよくある落とし穴です。 無いかどうかを証明するために、追記をお願いしたいのです。 可能性は一個ずつ潰して行くべきと思います。
shimazu

2018/12/26 06:43

追記しました
kazto

2018/12/26 06:50

ありがとうございます。問題無さそうですね。 1) ちなみに、CSVファイルにUnicodeのBOMが付いてる、なんてことは無いでしょうか。可能性の一つとして。 2) `header_converter `を使わず、0、1などの整数のインデックスでrowから値を取り出すことはできますか?
shimazu

2018/12/26 07:06

1については追記しました。 2についてはrow[0]でデータ取れますね。 これでやってみます。
shimazu

2018/12/26 07:10

そもそもいらないところに`,` をつけてしまっていたことが原因でした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問