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

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

ただいまの
回答率

90.36%

  • Ruby

    8148questions

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

  • CSV

    701questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby:配列をsplitしたもので全体をsortしたい。

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 194

funky_animal

score 1

 前提・実現したいこと

Ruby
CSVで読み込んだ配列を分けてそれごとに全体をsortしたい。
言葉で説明するのが難しいので図の例で説明します。


これを
[1|abc2|1,1,2]
[1|abc2|3,2,3]
[1|abc2|2,3,3]
[1|abc1|1,4,4]
[1|abc1|2,5,2]
[2|abd1|2,7,5]
[2|abd1|1,3,3]
[3|acd2|1,4,2]
こうしたい
[1|abc1|1,4,4]
[1|abc1|2,5,2]
[1|abc2|1,1,2]
[1|abc2|2,3,3]
[1|abc2|3,2,3]
[2|abd1|1,3,3]
[2|abd1|2,7,5]
[3|acd2|1,4,2]

 試したこと

p row[0].split("|").sort {|a,b| a[0]<=>a[0]}

これを表示してもrow[0]の
["1","abc1","1"]
["1","abc1","2"]
["1","abc2","1"]
["1",abc2","2"]
["1",abc2","3"]
["2",abd1","1"]
["2",abd1","2"]
["3",acd2","1"]
これができるだけです。

 補足情報

プログラミング初心者です。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

splitせずに比較でいかがでしょうか。

追記:
入力をタブ区切りに、出力をCSV形式にしました。

data = File.open("sample.bl6").readlines.map{|v| v.chomp.split("\t")}
data.sort!{|a, b| a[0] <=> b[0]}

# CSVクラスを使わず
File.open("result.csv", "w") do |fh|
  data.each do |line|
    fh.puts line.join(",")
  end
end

# CSVクラス使って。どちらでもお好きな方で。
CSV.open("result.csv","w") do |fh|
  data.each do |line|
    fh << line
  end
end

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/19 13:09

    早くも返信有り難うございます!
    実際にやってみると、そのようになったのですが、僕の説明足らずのようで。
    CSV.foreach("sample.bl6",:col_sep => "\t") do |row|
    p row[0].split("|").sort {|a,b| a[0]<=>a[0]}
    end
    これが自分が最初やってみたことなんですが、bl6というファイル形式でタブでわけられているのを配列にしています。
    kaztoさんのようにやってみるとsortはうまいことできたのですが、次の目的が、タブごとに分けて、それをcsvに書き出すといった手順ができません。
    CSVに書きだすのは調べたらできるとおもうのですが、ここからタブごとに分ける方法が皆目見当がつかないのでよろしければご教授ください。

    キャンセル

  • 2018/04/19 13:23

    sample.bl6ファイルの内容は、
    3|acd2|1タブ4タブ2
    で、それを、ご要望の形でソートしたのち、
    3|acd2|1,4,2
    の形式で保存する。のような認識で間違いないでしょうか。

    キャンセル

  • 2018/04/19 13:46

    間違いないです。よろしくお願いします。

    キャンセル

  • 2018/04/19 14:02

    更新しました。

    キャンセル

  • 2018/04/19 14:16

    ありがとうございます!
    かなり希望に近いデータを作れました。
    ただ|で分けて、その部分をそれぞれsortできないので、それは頑張って検討してみます。

    キャンセル

0

勝手に、先頭の|区切り文字列の1番目で数値順でソート
同値の場合は2番目を辞書順にソート
それも同値ならば3番目を数値順
かな、と思ったので

sorted_list = CSV.read('sample.bl6', col_sep: '\t').sort_by{|it|
  arr = it[0].split('|')
  [arr[0].to_i, arr[1], arr[2].to_i]
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • Ruby

    8148questions

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

  • CSV

    701questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。