質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Ruby

    7971questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

テキストファイルの内容を指定数行分ごとに一行に連結を繰り返すには

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 925

LIATARET

score 9

以下のような内容のテキストファイルを読み込んで、
1A
2A
3A
1B
2B
3B
1C
2C
3C
 .
 .
 .

このように3行ごとに1行に連結を繰り返して書き換えたいのですが、どうしたら良いでしょうか。
1A, 2A, 3A
1B, 2B, 3B
1C, 2C, 3C
 .
 .
 .

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+2

もうちょっとエレガントに書けそうな気がしますが、とりあえず。

data = IO.readlines("datafile").map(&:chomp)

n=-1
join_3lines = data.chunk{n+=1; n/3}.map{|k,v| v.join(",")}

puts join_3lines

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/17 22:28

    回答ありがとうございます。
    おかげさまで希望通りに書き換えることが出来ました。
    コードが短くてかっこいいですね。
    内容を理解したいと思います。

    キャンセル

+2

each_slice をつかって書いてみました。
(入力行数が 3 の倍数で無かった場合の挙動を他の回答と比べてみてほしいです)

a.rb

lines = IO.readlines('data.txt').map(&:chomp)

lines.each_slice(3) do |arr|
  puts arr.join(',')
end


実行例

$ cat data.txt
1A
2A
3A
1B
2B
3B
1C
2C

$ ruby a.rb
1A,2A,3A
1B,2B,3B
1C,2C

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/18 13:50

    回答ありがとうございます。
    短くて分かりやすいですね。
    勉強になります。

    キャンセル

checkベストアンサー

0

ベタなやり方ですが、ご参考まで。

# coding: utf-8

begin
  File.open('input.txt') do |file|

    line_count = 0      # 読み込み中の行番号
    three_items = ''    # 連結した文字列を作る変数

    file.each_line do |line|
      line.chomp!
      break if line.length == 0 

      line_count +=1    # 行番号をインクリメント

      three_items += line

      if line_count % 3 == 0 then   # 行番号が3で割り切れる場合
        puts three_items    # 連結した文字列を表示
        three_items = ''    # 連結した文字列を空にする。
      else
        three_items += ','  # 行番号が3で割り切れない場合、まだ後に連結するのでカンマを追加
      end 

    end 
  end 
rescue SystemCallError => e
  puts %Q(class=[#{e.class}] message=[#{e.message}])
rescue IOError => e
  puts %Q(class=[#{e.class}] message=[#{e.message}])
end


上記を、tera32595.ruby で保存し、入力ファイルは input.txt で作成しておき、
実行してみたのが以下です。

[ykt68@MacMini teratail]$ date
2016年 4月17日 日曜日 21時45分22秒 JST
[ykt68@MacMini teratail]$ cat input.txt
1A
2A
3A
1B
2B
3B
1C
2C
3C
[ykt68@MacMini teratail]$ ruby tera32595.ruby
1A,2A,3A
1B,2B,3B
1C,2C,3C
[ykt68@MacMini teratail]$

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/17 22:30

    回答ありがとうございます。
    おかげさまで希望通りに書き換えることが出来ました。
    理解しやすく助かりました。

    キャンセル

0

処理の順番を書きます。

1・インデックスiを初期化
2・文字列バッファをクリア
3・インデックスiをインクリメント
4・文字列バッファに区切り文字、次の文字列を連結
5・もしインデックスが3なら1へ、そうではなければ6へ続行
6・文字列バッファから最後の1文字(区切り文字)を削除して出力
7・3へ戻る

変なネストになるかもしれないので適宜インデックスと文字列バッファの初期化の位置を工夫してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

基本的なロジックとして

行が3の倍数だったら、そのまま出力(print)
それ以外なら、改行をとってカンマを付与してprint

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7971questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。