rubyで配列をcsvに格納する際、1要素ごとに改行する方法
受付中
回答 4
投稿
- 評価
- クリップ 0
- VIEW 11K+
質問させて頂きます。
現在、スクレイピングしたデータをcsvに書き出すプログラムを作成しております。
データは5個づつ取得され、そのデータが5個の要素として配列に格納されます。
array["データ1-1","データ1-2","データ1-3","データ1-4","データ1-5"]
この配列をcsvに書き出し、配列をクリアし、また新たに5個のデータを取得しcsvに追記する
という繰り返しのプログラムになっております。
この5個の要素を書き出す際、現在は5要素1行として書き出されており、
csvには以下の様になっております。

これを要素ごとに改行された状態で書き出したいと思っております。
目標としておりますのはこの様に書き出されたcsvです。

いろいろ調べて試しましたが、
スマートに出来る方法が見つけられず困っております。
何卒、皆様のお知恵をおかし頂ければと思います。
よろしくお願い致します。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
each
で一要素ずつ書き込めばいいんじゃないかと思います。
# 5 個づつデータを取る関数のダミー
def get_array
yield ["データ 1-1","データ 1-2","データ 1-3","データ 1-4","データ 1-5"]
end
File.open("foo.csv", 'w') {|fp|
get_array{|ary|
ary.each {|el| fp.puts el }
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
# -*- coding: utf-8 -*-
require 'csv'
data = ['データ1-1', 'データ1-2', '"1"', 'A,B', "'a,b'", "改行\nデータ"]
csv_string = CSV.generate do |csv|
data.each do |d|
csv << [d]
end
end
puts csv_string
実行すると次のようになります。
katoy-no-MacBook-Pro:zzz katoy$ ruby csv.rb
データ1-1
データ1-2
"""1"""
"A,B"
"'a,b'"
"改行
データ"
csv のライブラリーを利用すると、データが ダブルコーテション、シングルコーテーション、 カンマなど csv 出力で考慮すべき事を処理してくれます。
参考:
- Ruby 2.1.0 リファレンスマニュアル > ライブラリ一覧 > csvライブラリ > CSVクラス http://docs.ruby-lang.org/ja/2.1.0/class/CSV.html より引用
# ファイルへ書き込み
CSV.open("path/to/file.csv", "wb") do |csv|
csv << ["row", "of", "CSV", "data"]
csv << ["another", "row"]
# ...
end
# 文字列へ書き込み
csv_string = CSV.generate do |csv|
csv << ["row", "of", "CSV", "data"]
csv << ["another", "row"]
# ...
end
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-1
each
でひとつずつputs
で出力すれば1要素ごとに改行されます。
DATA.readlines.each do |line|
array = line.split("\t") # array["データ1-1","データ1-2","データ1-3","データ1-4","データ1-5"]
array.each do |i|
puts i
end
end
__END__
データ1-1 データ1-2 データ1-3 データ1-4 データ1-5
データ2-1 データ2-2 データ2-3 データ2-4 データ2-5
データ3-1 データ3-2 データ3-3 データ3-4 データ3-5
もしくは、
join
で要素を改行文字区切りで結合する方法もあります。
puts array.join("\n")
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-1
目標としておりますのはこの様に書き出されたcsvです。それはcsvとは呼びません。カンマ出てこないので。
array = ["データ1-1","データ1-2","データ1-3","データ1-4","データ1-5"]
puts array
で、1行1データで書き出せます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる