ハッシュのバリューのみを取り出してCSV出力
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 3,941
hash = {"birthday"=>”2016/05/28", "family_name"=>"sasaki","last_name"=>"taro"}
このハッシュのバリューのみをそれぞれダブルクオテーションでくくり、カンマ区切りで取り出してcsv出力し、出力されたcsvファイルエクセルで開いたときに、
1列目 2列目 3列目
2016/05/28 sasaki taro
と、なるようにしたいです。(カラムの1列目、2列目、3列目は要りません。)
どのようなrubyプログラムのコードを書けば良いでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
全バージョン共通です.
- ハッシュのキーを文字列で定義する意味は薄いのでシンボル使いました.もしここが変更出来ない場合は
map
に使っているシンボルの配列に関しても,シンボルではなく文字列にしてください. - Excelで一発で開けるように,コンマ区切りではなくタブ区切りにしました.
- 日本語がExcelで化けないように,先頭3バイトとしてBOMを付与しています.
- 日本語がMac版のExcelでも化けないように,文字コードはUTF-8ではなくUTF-16LEにしました.
- 一度文字列としてUTF-8のCSVを生成してからまとめて書き込んだほうがコード量は少なくなりますが,大量のデータを一度に書き込む際に困るため,逐次文字コードをUTF-16LEに変換しながら1行ずつ書き込んでいく書き方にしました.
require 'csv'
hash = {
birthday: '2016/05/28',
family_name: '佐々木',
last_name: '太郎',
}
File.open('data.csv', 'wb:UTF-16LE') do |file|
file.write "\uFEFF"
CSV.open(file, 'wb:UTF-16LE', col_sep: "\t") do |csv|
csv << [:birthday, :family_name, :last_name].map{|k| hash[k].encode('UTF-16LE')}
end
end
Ruby1.9からはこちらでもいいです.分かりにくいのであまりおすすめはしませんが
require 'csv'
hash = {
birthday: '2016/05/28',
family_name: '佐々木',
last_name: '太郎',
}
File.open('data.csv', 'wb:UTF-16LE') do |file|
file.write "\uFEFF"
CSV.open(file, 'wb:UTF-16LE', col_sep: "\t") do |csv|
csv << hash.values.map{|v| v.encode('UTF-16LE')}
end
end
ちなみにダブルクオーテーションに関してですが,文字列が改行などを含んでいたりして必要なときだけ括るという処理になるかと思います.
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
具体的はコードはすでに回答されていますので、参考情報を紹介します。
- OM付きUTF-8のCSVを作成する(Excel文字化け対策) http://qiita.com/necojackarc/items/5e865a4aa039fdd3f2c0
- CSVをエクセルでも見れる文字コードUTF-16LE(リトルエンディアン)で出力するメモ http://qiita.com/meguroman/items/b9230ba93f554d231859
- rubyでcsv出力(SJIS、かつheaderをつけて)するプログラムを書きたい https://teratail.com/questions/8937
- RailsでExcelを出力する http://cobachie.hatenablog.com/entry/2015/04/28/115135
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/03/30 12:24