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

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

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

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

Ruby

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

Q&A

解決済

1回答

1996閲覧

RubyのCSV::Tableクラスで作成したカラム`table[:id][0]`に値が代入できないのはなぜですか

hanzoo

総合スコア28

CSV

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

Ruby

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

0グッド

0クリップ

投稿2017/05/04 07:37

編集2017/05/04 07:45

RubyのCSV::Tableクラスで作成したテーブルのカラムに100を代入する場合、table[0][0] = 100は可能ですが、table[:id][0] = 100では値が代入できないのはなぜでしょうか。

以下のようにCSVデータを用意し、pryを実行しました。

扱うCSVデータ

csv

1# data.csv 2 3id,name,age 41,hattori,25 52,hanzoo,35

Pryを実行

$ pry

Terminal

1[1] pry(main)> require 'csv' 2=> true 3 4[2] pry(main)> table = CSV.table('data.csv') 5=> #<CSV::Table mode:col_or_row row_count:3> 6 7[3] pry(main)> puts table 8id,name,age 91,hattori,25 102,hanzoo,35 11=> nil 12 13# 値が代入できない 14 15[4] pry(main)> table[:id][0] = 100 16=> 100 17 18[5] pry(main)> puts table 19id,name,age 201,hattori,25 212,hanzoo,35 22=> nil 23 24# 値が代入できる 25 26[6] pry(main)> table[0][0] = 100 27=> 100 28 29[7] pry(main)> puts table 30id,name,age 31100,hattor,25 322,hanzoo,35 33=> nil

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

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

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

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

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

guest

回答1

0

ベストアンサー

CSV::Tableクラスのオブジェクトに [カラム名] を指定した場合は、そのカラムの値を(コピーして)取り出した配列を返すため、元のデータは変更されないようになっています。以下のドキュメントに記述がありましたので、よかったら読んでみてください。

instance method CSV::Table#[] (Ruby 2.4.0)

投稿2017/05/04 07:44

編集2017/05/04 07:45
kenchankunsan

総合スコア240

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

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

hanzoo

2017/05/04 09:15

早速の回答ありがとうございます!URLも参考になります。
hanzoo

2017/05/04 09:29 編集

教えていただいたURL先の文中のことで、もし教えていただけると嬉しいのですが、 > ミックスモードでは、このメソッドは引数に`行番号を指定`すれば行単位で動作し、`ヘッダの名前を指定`すれば列単位で動作します。 とあるのですが、今回の質問を例にすると`行番号を指定`とは `table[0][0]`のこと、`ヘッダの名前を指定`とは`table[:id][0] = 100`のことであっていますか? `table[0][0] = 100`で値100を代入しようとした場合も、元の値を元のデータに影響ないはずなのかなと思ったのですが、間違った認識でしょうか。
kenchankunsan

2017/05/05 12:28

確かにその通りだと思いましたので、確認してみました。 以下はirbで同様のCSVをパースしてみた結果です。 ``` irb(main):002:0> t = CSV.table('hoge.csv') => #<CSV::Table mode:col_or_row row_count:3> irb(main):003:0> t[0] => #<CSV::Row id:1 name:"hattori" age:25> irb(main):004:0> t[:id] => [1, 2] ``` カラム名を指定したときは配列が、行番号を指定したときには`CSV::Row`オブジェクトが返っています。そのため、`table[0][0] =` は `CSV::Row#[]=` メソッドの呼び出しになり、値を代入できるようです。 [instance method CSV::Row#[]= (Ruby 2.4.0)](http://rurema.clear-code.com/2.4.0/method/CSV=3a=3aRow/i/=5b=5d=3d.html) `CSV::Table[]` の挙動がドキュメントと違うのではないかという印象を受けました。こちらも勉強になりました!質問いただきありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問