■
CSVファイルとRubyの備忘録
最近RubyのコードでCSVファイルを使う事があったのでまとめました!
CSVファイルとは
comma-separated values(略称:CSV)は、いくつかのフィールド(項目)を区切り文字であるカンマ「,」で区切ったテキストデータおよびテキストファイル。拡張子は .csv、MIMEタイプは text/csv。 wiki
例えばこんな感じの中身 diary.csv
id,title,content 1,今日はジム,腕立て伏せと腹筋と、スクワットをしました。 2,今日はスターバックスで勉強,とても混んでいて勉強どころではなかった。 3,美術館で草間彌生展,とても素敵な絵画が多かっった。
1行目がカラムの要素、2行目からid,title,content
という風にカンマで区切られています。
用途は色々だと思いますが、エクセルの表の様にデータをまとめる事ができます。RubyにはCSVファイルを扱うライブラリがあり、とても扱いやすくなっています。その中で、いくつかのコードを忘れない様に書き記します(自分用)!
使用方法
まずはrequire 'csv'
を記載
- 読み込み
require 'csv' csv = CSV.read("/path/to/file.csv") readメソッドで csv = CSV.read("diary.csv") => [["id", "title", "content"], ["1", "今日はジム", "腕立て伏せと腹筋と、スクワットをしました。"], ["2", "今日はスターバックスで勉強", "とても混んでいて勉強どころではなかった。"], ["3", "美術館で草間彌生展", "とても素敵な絵画が多かっった。"]
- foreachを使って1行ずつ読み込むこともできる
require 'csv' CSV.foreach("diary.csv") do |row| p row end ["id", "title", "content"] ["1", "今日はジム", "腕立て伏せと腹筋と、スクワットをしました。"] ["2", "今日はスターバックスで勉強", "とても混んでいて勉強どころではなかった。"] ["3", "美術館で草間彌生展", "とても素敵な絵画が多かっった。"]
- 書き込む時
require 'csv' CSV.open("dairy.csv", "wb") do |csv| csv << ["4", "Yokohama.rbにいく", "プログラミングが好きな人が多かった!"] csv << ["5", "ハッカーの映画を見る", "聞いたことのある言語が英語で聞けた!なんか感動!"] end <#CSV io_type:File io_path:"diary.csv" encoding:UTF-8 lineno:2 col_sep:"," row_sep:"\n" quote_char:"\"" headers:["4", "Yokohama.rbにいく", "プログラミングが好きな人が多かった!"]>
これでもいける!!
CSV.open("diary.csv", "a") do |csv| csv.puts ["6","今日は門前仲町に行きました","行ったらイベントが休みだった!メールで来てた!"] end
dairy.csvを見ると
id,title,content 1,今日はジム,腕立て伏せと腹筋と、スクワットをしました。 2,今日はスターバックスで勉強,とても混んでいて勉強どころではなかった。 3,美術館で草間彌生展,とても素敵な絵画が多かっった。 4,Yokohama.rbにいく,プログラミングが好きな人が多かった! 5,ハッカーの映画を見る,聞いたことのある言語が英語で聞けた!なんか感動!
4と5がちゃんと増えています。
また面白いと思ったのは、CSV::tableを使って、データベースのテーブルの様に扱うことができる点
require 'csv' table = CSV.table("diary.csv") => #<CSV::Table mode:col_or_row row_count:6> #header含め6行 table.headers => [:id, :title, :content] # headerを確認できる table.class => CSV::Table #インスタンスはcsv.tableクラス table[0] => #<CSV::Row id:1 title:"今日はジム" content:"腕立て伏せと腹筋と、スクワットをしました。"> #インデックスで取得できる table[1] => #<CSV::Row id:2 title:"今日はスターバックスで勉強" content:"とても混んでいて勉強どころではなかった。"> table.first => #<CSV::Row id:1 title:"今日はジム" content:"腕立て伏せと腹筋と、スクワットをしました。"> able[:id] => [1, 2, 3, 4, 5] #headerでも取得可能 table[:title] => ["今日はジム", "今日はスターバックスで勉強", "美術館で草間彌生展", "Yokohama.rbにいく", "ハッカーの映画を見る"]
- ループでも回せる
table.each do |row| puts "#{row[0]} #{row[1]} #{row[2]}" end #=> 1 今日はジム 腕立て伏せと腹筋と、スクワットをしました。 2 今日はスターバックスで勉強 とても混んでいて勉強どころではなかった。 3 美術館で草間彌生展 とても素敵な絵画が多かっった。 4 Yokohama.rbにいく プログラミングが好きな人が多かった! 5 ハッカーの映画を見る 聞いたことのある言語が英語で聞けた!なんか感動! => #<CSV::Table mode:col_or_row row_count:6>
- 消したい行がある時
csv_table = CSV.table("diary.csv", headers: true) csv_table.by_row! csv_table.delete_if { |row| row.field?("今日はジム") }
結構値の取得方法があり、まさにデータベース!さすがRubyのライブラリですね!