あるシステムから別のシステムへデータを送ることはよくあります。同じサーバー内にあれば問題ないのですが、別のサーバーや異なる会社間であれば大変です。
開発言語やフレームワーク、データベース製品が異なることもあれば、OSからちがうことは普通にあります。しかしどんな開発言語、フレームワーク、OSであれ、物理ファイルくらいは操作できますので、システム間でデータを受け渡しするときはこれを使わない手はありません。
また物理ファイルに書く内容も、お互いでルール決めをしておくと大変使いやすく便利です。
本記事では、システム間連携において非常によく使われるCSVについて解説します。
CSVとは何か?
CSVとは、データをカンマ区切りにして、ファイルに保存したものです。
CSVの正式名称はComma Separated Valueの略ですので、名前からもカンマ区切りであることがもうかがえます。
CSVはRubyに限らず、一般的によく使われているファイル形式です。
ExcelでもCSV形式で保存することができますし、家計簿ソフトや年賀状ソフトにおけるデータのインポート・エクスポートでもCSVはよく使われています。
何らかのWebサービスにおいても「CSVで出力」というボタンがついているのを見かけます。
カード会社のサービスにて、利用情報をExcelに取り込むときに使えます。
「・・・そういえば何か見たことがあるような気が?」と思われた方も多いことでしょう。
CSVの具体的な内容
イメージしやすいように、Rubyでのあつかいを解説する前に、Excelだけで解説を完結してみます。
まずはExcelの表形式で、生徒の点数表を例にして解説します。
以下のようなデータがあったとしましょう。ファイル名を「点数表.xlsx」とします。
「ファイル」「名前を付けて保存」を選択し、保存ダイアログを開きます。ここでファイル形式を「CSV(コンマ区切り)(.csv)」してください。
エラーダイアログが開いたりいろいろしますが、気にせず保存です。
ファイル名を指定しないかぎり、Excelのファイル名+.csvでファイルができます。
メモ帳やNotepad、お好みのテキストエディタでそのファイルを開いてください。
生徒番号,名前,国語,算数,理科,社会 1,生徒 太郎,65,70,80,50 2,生徒 花子,80,90,100,95 3,生徒 二郎,45,55,65,35 4,生徒 美香,100,100,100,100
いかがでしょうか?CSVという名前どおり、カンマ区切りでファイルが保存されたのが分かりましたね。
実際のシステム間連携では、1つめのデータが何で、2つめが何で・・・と事前に合意をとるので、通常は一番上の項目名はCSVファイルに出力しません。
CSVファイルから読み込む(パース)
CSVファイルからデータを読み込みましょう。全行を一度に読み込み方法と、1行づつ読み込む方法があります。
全行を一度に読み込む
上記で使用した点数表.csvを使います。
データを読み込んでカンマごとでデータを取り出して・・・という解析をパースといいます。
ではCSVをパースしてみます。
require "csv" score_list = CSV.read("点数表.csv") p score_list
[実行結果]
[["生徒番号", "名前", "国語", "算数", "理科", "社会"], ["1", "生徒 太郎", "65", "70", "80", "50"], ["2", "生徒 花子", "80", "90", "100", "95"], ["3", "生徒 二郎", "45", "55", "65", "35"], ["4", "生徒 美香", "100", "100", "100", "100"]]
1行1行が配列になっているのが分かります。もちろん要素番号を指定することも可能です。
require "csv" score_list = CSV.read("点数表.csv") p score_list[1]
[実行結果]
["1", "生徒 太郎", "65", "70", "80", "50"]
配列の要素番号は0からです。1を指定すれば2行目を指定することになるので注意してください。
1行づつ読み込む
今度は1行づつ読み込む方法です。
require "csv" CSV.foreach("点数表.csv") do |row| p row end
[実行結果]
["生徒番号", "名前", "国語", "算数", "理科", "社会"] ["1", "生徒 太郎", "65", "70", "80", "50"] ["2", "生徒 花子", "80", "90", "100", "95"] ["3", "生徒 二郎", "45", "55", "65", "35"] ["4", "生徒 美香", "100", "100", "100", "100"]
同じ結果が得られました。
1行づつ何かの処理をしたいときには便利ですね。
注意:
環境によってはExcelからShift_JIS形式でファイル出力されてしまい、Rubyで読み込み時にエラーが発生します。その場合はお手持ちのエディターでエンコードをUTF-8に変換してください。
CSVファイルを書き出す
先ほどとは逆に、CSVファイルを書き出す方法を解説します。
require "csv" CSV.open("点数表2.csv", "w") do |test| test << ["1", "生徒 太郎", "65", "70", "80", "50"] test << ["2", "生徒 花子", "80", "90", "100", "95"] test << ["3", "生徒 二郎", "45", "55", "65", "35"] test << ["4", "生徒 美香", "100", "100", "100", "100"] end
先ほど出た結果をそのまま、点数表2.csvという名前で書き出してみました。
CSVクラスのopenメソッドに、第一引数にファイル名、第二引数にモードを指定して書き込むことができました。
まとめ
本記事ではCSVファイルとは何か、その基本的なあつかい方を解説しました。
CSVライブラリにはもっとたくさんの機能があります。詳しくはこちらをご覧いただき、CSVの効率的なあつかい方を探してみてくださいね!