誕生日にもらった意外なもの

Rubyを使った列同士の結合について教えてください。

現在
ID 大英字 小英字 平仮名 片仮名 大ギリシア 小ギリシア
1 A a あ ア Α α
2 B b い イ Β β
3 C c う ウ Δ ⊿
4 D d え エ Γ γ
5 E e お オ Ε ε

以下続く。

となっているスペース区切りのデータがあります。
それを

ID,大英字, ID,小英字, ID,平仮名, ID,片仮名, ID,大ギリシア, ID,小ギリシア,
1,A, 1,a, 1,あ, 1,ア, 1,Α, 1,α,
2,B, 2,b, 2,い, 2,イ, 2,Β, 2,β,
3,C, 3,c, 3,う, 3,ウ, 3,Δ, 3,⊿,
4,D, 4,d, 4,え, 4,エ, 4,Γ, 4,γ,
5,E, 5,e, 5,お, 5,オ, 5,Ε, 5,ε,

以下続く。
のように、出力したいです。
エクセルでやろうと思ったのですが、
データ数が多くエクセルがハングアップして強制終了に陥いってしまい、一向に作業が進まなく困っております。
どのような形にしたいかを言葉にすると、以下のように
一列目,二列目, 一列目,三列目, 一列目,四列目, まだ続く
のように、"一列目""カンマ""二列目""カンマ""スペース""一列目""カンマ""三列目""カンマ""スペース"
というようになってほしいという事です。
つまりID,大英字,が一列目の先頭 ID,小英字,が二列目の先頭
であります。

エクセル上に展開してからならばVBAも動かせたのですが、エクセル上に展開する前段階でハングアップとなってしまうため、VBAに頼れなくなっております。展開せずに流動処理もできるという話は聞いたことがあるのですが、恥ずかしながらこれを知りません。
なぜRubyかというと、研究計算プログラムがRubyをエンジンとしているためRubyなら大容量計算ができているため動いてくれると思っているからです。(なお、プログラムのインストールは禁止されているため他の言語は使えません。)
Rubyは2.1が搭載されております。

よろしくお願いします。お知恵をお貸しください。

質問者からの補足コメント

  • 投稿したら分かりにくくなったので補足いたします。
    1,A, 1,a, 1,あ,の間にあるカンマは区切り文字ではありません。
    1,A,「スペース」1,a,「スペース」1,あ,
    であります。
    よって欲しいファイル形式は
    スペース区切りのテキストファイル(エクセル出力風でいうと、スペース区切りテキスト(.prn)ファイルであります。

      補足日時:2017/01/19 02:02

A 回答 (2件)

以下でどうでしょうか



※段付け表示の為、行頭に全角スペースを付加しているので削除してください。
※質問欄ご提示の入力データはタブ区切りでしたので、そう対応しましたが
 もしスペース区切りの場合は、プログラム中のコメントの場所を修正してください。
※使用文字コード(プログラム、データ共)は適切に指定してください。



File.open("output.txt","w") do |fo|
 File.foreach("input.txt") do |line|
  line.chomp!
  ary = line.split("\t") # ←ここ
  fo.puts ary[1 .. ary.size-1].map{|e| ary[0]+","+e+","}.join(" ")
 end
end
    • good
    • 0
この回答へのお礼

ありがとうございます。
スペース区切りであったため、当該箇所を" "に書き換えて使用させていただいております。
作業が高速化でき、非常に助かっております。

今後のために、少しお聞きしたいです。
|fo|というのは書きこむために作成するファイルを指しているのでしょうか?

fo.puts ary[1 .. ary.size-1].map{|e| ary[0]+","+e+","}.join(" ")

の部分でary.size-1としているのはrubyは1列目をゼロとカウントするからでしょうか?

その後ろの|e|ですが、これは列をいったん格納する変数という感じなのでしょうか?

お礼日時:2017/01/20 01:28

No.1です。



> 今後のために、少しお聞きしたいです。

お礼欄に書かれた内容で、良いと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
結構とっつきやすそうな言語なのですね。
rubyを本格的に勉強してみます。

お礼日時:2017/01/20 11:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!