Rubyを利用したCSVファイルの書き出し

Rubyで作成した変数をCSVに書き出し。

CSV.open("file.csv", "w") do |csv|
  users.each do |user|
    id = user.id
    name = user.name
    gender = user.gender
    age = user.age
    p "#{id}, #{name}, #{gender}, #{age}"
    csv << [id, name, gender, age]
  end
end

参考記事。

class CSV (Ruby 2.0.0)

CSVファイル・アクセス(3/4):ビギナーのためのRubyプログラミング入門

brewのアップデート(brew update)失敗への対処(Error: Failed while executing git pull origin)

mysqlをインストールするためにbrewを利用。

久しぶりに利用するために brew update したが、下記のエラーが。

 

Error: Failed while executing git pull  origin

 

解決法はこちら。

brewのアップデート(brew update)に失敗してしまったので対処する - F13

 

$ cd `brew --prefix`
$ git fetch origin
$ git reset --hard origin/master

 これで解決。

MySQLの出力結果をファイルに出力する方法。

teeコマンドを使うと簡単。

mysql> tee output.txt
Logging to file 'output.txt'
mysql> select * from users order by gender;
+----+--------+--------+------+
| id | name   | gender | age  |
+----+--------+--------+------+
|  3 | alice  | f      |   15 |
|  5 | jasmin | f      |   17 |
|  1 | john   | m      |   18 |
|  2 | paul   | m      |   20 |
|  4 | dabid  | m      |   17 |
+----+--------+--------+------+
5 rows in set (0.00 sec)

mysql> select * from users where gender = 'm' order by age;
+----+-------+--------+------+
| id | name  | gender | age  |
+----+-------+--------+------+
|  4 | dabid | m      |   17 |
|  1 | john  | m      |   18 |
|  2 | paul  | m      |   20 |
+----+-------+--------+------+
3 rows in set (0.01 sec)

mysql> select * from users where gender = 'f';
+----+--------+--------+------+
| id | name   | gender | age  |
+----+--------+--------+------+
|  3 | alice  | f      |   15 |
|  5 | jasmin | f      |   17 |
+----+--------+--------+------+
2 rows in set (0.00 sec)

mysql> notee
Outfile disabled.

ファイルの出力を開始するには、MySQL 接続語に tee を実行し、出力終了時には notee を実行する。 出力先のファイルパスは絶対パスでも相対パスでもOK。ファイル名だけを指定した場合は、mysql へ接続したフォルダ(ディレクトリ)にファイルが生成される。

mysqlエラー:there can be only one auto column and it must be defined as a key

mysql> create table users(id int auto_increment, name varchar(20), gender varchar(20), age int);

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

 

こんなエラーが出た。

 

mysql: auto_increment は主キーにしないといけない | BmathLog

 

auto_increment があると、そのカラムは主キーでなければいけないらしい。

primary key(id)を入れたら先に進めた。

 

mysql> create table users(id int auto_increment, name varchar(20), gender varchar(20), age int,primary key(id));

 

 

Rubyでハッシュを利用する際の文字列とシンボルの違い

プログラミング初心者のため、他サイトを参考にまとめてみる。

テーマはRubyでハッシュを利用する際に文字列利用とシンボル利用の違いである。

 今回のテーマは何度本を読んでも理解できないオブジェクト指向に関連するテーマのように感じるため、本質的な理解は先になりそうだが。。

 

まずは「Ruby シンボル」で検索。下記記事が非常に参考になる。

 

Rubyのシンボルは文字列の皮を被った整数だ!

 

Ruby空間における操作対象(オペランド)はオブジェクトである。Rubyオペレータはオブジェクトしか取り扱わない。オブジェクトはユーザによって初めてRuby空間に生み出されるが、それはクラスという設計図に従って常に構築される。

(中略)

Ruby空間に生み出されたすべてのオブジェクトはそれぞれが固有のID(object_id)を持っていて、RubyオペレータはこのIDで個々のオブジェクトを管理する。

 

相変わらずオブジェクトがなんなのかはよくわからないが、Rubyを書いている時にはオブジェクトしか扱っておらず、全てのオブジェクトはそれぞれ固有のIDを持っているということらしい。

 

次は固有のIDについて調べてみる。

ref.xaio.jp

 

object_idメソッドは、レシーバのオブジェクトIDを返します。オブジェクトIDは、オブジェクトごとに固有の整数値です。レシーバが同じオブジェクトなら必ず同じオブジェクトIDになり、違うオブジェクトなら別のオブジェクトIDが返ります。

str1 = "hello"
puts str1.object_id
str2 = "hello"
puts str2.object_id
10262880
10262528    (実行ごとに結果は変わります)

 

さっきの記事と似たようなことが書いてある。コードを見ると、"str1"と"str2"は同じ文字列"hello"が代入されているが、オブジェクトIDは異なる事がわかる。コンピューターは同じ文字でつでも違うオブジェクトと認識しているようだ。

 

RubyのオブジェクトIDと、ディープ/シャロー(deep/shallow)コピーについて | task blog

 

1
2
1.object_id   #=> 3
'1'.object_id #=> 70183691563540

 ちなみに、'1'とかは、内部的にはString.new('1')をしているのと同じなので、毎回オブジェクトIDが異なります。

ただ1は、オブジェクトIDは変わりません。

赤字の部分を読むと、なんとなくどんな処理を内部で行っているかイメージする事ができる。同じ文字列でも内部的には新たな'1'を生成しているようだ。

 

面白い比較があった。

 

シンボルとは何か その1(後編) - 文字列のintern - 世界線航跡蔵

 

intern操作によって、文字列はオブジェクトとして一意になる。だから、同一性判定するだけで低コストで比較できる。

  1. 10.times do  
  2.   p "foo".object_id  
  3. end  

すると毎回違う結果が出るが、

  1. 10.times do  
  2.   p "foo".intern.object_id  
  3. end  

は同じ結果がずらりと並ぶ。この「文字列をinternした結果」こそがSymbolオブジェクトなのである。

 

最初の記事に戻って結論。

 

Rubyのシンボルは文字列の皮を被った整数だ!

シンボルの特性をまとめてみよう。

  1. 文字列と一対一に対応した記号である(文字列オブジェクトとシンボルオブジェクトは多対一の関係になる)
  2. 同一記号のシンボルはRuby空間に唯一つ存在する(整数と同様、文字列と相違)
  3. シンボル記号自体が意味付けを表象できる(文字列と同様、整数と相違)

これらの特性を考えれば、そのオブジェクトの変更が予定されない場合、無駄なオブジェクトが生成されないシンボルは、速度の点で文字列オブジェクトよりも有利であり、またその記号の可読性を高めたい場合、整数オブジェクトよりも有利である。

 

 文字列を利用する場合は、同じ文字列でも新しいオブジェクトが生成されており、同一記号のシンボルがRuby空間に一つだけのシンボルを利用する際に比較して処理に時間がかかり、かつ管理のしやすさの面でもシンボルの方が有利ということだ。

 

今後も学習を進めながらオブジェクトの概念をつかめるようにしていきたい。