![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
お世話になります。
表題のとおり、言語[RUBY]を用いて、特定列をキーとした並び替えを行う際の記述を知りたいです。
現在input.txtの中に、スペース区切りのテキストで
id X Y Z
1 8 7 9
2 2 3 6
3 4 5 8
4 3 4 5
以下続く
となっています。Zが小さい方から大きい方に行ごと並び替えて、結果をout.txtに出力してほしいです。
結果として
id X Y Z
4 3 4 5
2 2 3 6
3 4 5 8
1 8 7 9
というイメージです。
現在は表計算ソフトでやってはいるのですが、量が多いと動かなくなってしまいまして。
input.txtは時にはスペース区切りのテキストで
id X,Y Z
1 8,7 9
2 2,3 6
3 4,5 8
4 3,4 5
以下続く
のようにX,Yが一塊になっている場合もあります。その時にはX,YのXの方を基準に並び替えたいです。
イメージは
id X,Y Z
2 2,3 6
4 3,4 5
3 4,5 8
1 8,7 9
です。すみませんがやり方をご存知の方、お助け願えませんでしょうか。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
以下で如何でしょうか
1.双方とも1行目の文字コード指定は環境に合わせて書き換えて下さい。
下記はWindows環境です。
2.扱う数値が実数の場合は、「to_i」を「to_f」へ変更してください。
id列の数値も実数になってしみますが……
前者
-----
#coding: cp932
key_col = 3 # idを第0列として、Zは第3列
is_header = true
header = ""
data = []
File.foreach("input.txt") do |line|
line.chomp!
if is_header
header = line
is_header = false
else
data.push(line.split(" "))
end
end
data.sort!{|a,b| a[key_col].to_i - b[key_col].to_i}
File.open("out.txt","w") do |f|
f.puts header
data.each do |e|
f.puts e.join(" ")
end
end
-----
後者
-----
#coding: cp932
is_header = true
header = ""
data = []
File.foreach("input.txt") do |line|
line.chomp!
if is_header
header = line
is_header = false
else
data.push(line.split(","))
end
end
data.sort!{|a,b| a[0].split(" ")[-1].to_i - b[0].split(" ")[-1].to_i}
File.open("out.txt","w") do |f|
f.puts header
data.each do |e|
f.puts e.join(",")
end
end
-----
siffon9様
お返事遅れてすみません。
たった今出先より戻って実行してみました。
ありがとうございます。表計算ソフトのフリーズにおびえなくて済みそうです。
一つお聞きしたいです。
「data.sort!」の部分でデータを並びなおせという事はなんとなくわかるのですが、小さい方から大きい方へ並びなおせというのは、どこで制御しているのでしょうか?
No.2
- 回答日時:
> X,YのXを基準に並び替えつつ。
かつZの小さい方から大きい方へという事も可能でしょうか?Z列、Y列、X列の順にソートをするようにしてみました。
これで如何でしょう?
#coding: cp932
is_header = true
header = ""
data = []
# データ読み込み
File.foreach("input.txt") do |line|
line.chomp!
if is_header
header = line
is_header = false
else
data.push line
end
end
# Z列ソート
data.sort_by!{|v| v.split(" ")[-1].to_i}
# Y列安定ソート
data.sort_by!.with_index{|v,index| [v.split(",")[1].split(" ")[0].to_i, index]}
# X列安定ソート
data.sort_by!.with_index{|v,index| [v.split(",")[0].split(" ")[-1].to_i, index]}
# ソート済みデータ出力
File.open("out.txt","w") do |f|
f.puts header
data.each{|e| f.puts e}
end
ありがとうございます。
欲しいデータが手に入りました。
そうか、Xソートの前にYソートやらないとぐちゃぐちゃになっちゃうのですか。
安定ソートという言葉自体を知らず、調べて、こんなのがあるんだと思いました。
カンマ区切りとスペース区切りが混在していても、もとの列を維持したままソートできるのはすごいです。
なんだか、魔術みたいです。
勉強不足過ぎました。ソースを見ながら動きも確認してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) Excel 2列分のDATAの並べ替え 1 2023/01/01 17:12
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- その他(Microsoft Office) 1の行を固定した上でVBAを用いて日付順に自動並べ替え 2 2022/06/06 15:09
- JavaScript javascriptでテーブルに追加した項目のid追加してローカルストレージを操作したい 5 2023/01/01 15:52
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Excel(エクセル) Googleスプレッドシートの割合の関数と円グラフの並べ替えについて 1 2022/07/22 17:31
- Excel(エクセル) 結合セルのソートについて 5 2022/04/22 11:57
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチ処理 特定の文字以降を...
-
VBA テキストボックスを選択状...
-
型の値をDataGridViewセルに変換...
-
findを使うのか?
-
言語[RUBY]を用いて、特定列を...
-
HTMLについて
-
文字列を引数にしたがって置換...
-
pythonでリストをCSVに出力する...
-
【ExcelVBA】300万件越えCSVか...
-
VBAでcsvファイルもシートもあ...
-
SQLファイルの読み込み
-
pycharmへのpysamインストール...
-
fortranでデータの抜き出しをし...
-
Fortran:列数の分からないデー...
-
ダブルコーテーション付きでCSV...
-
Ruby 正規表現による文字列取得
-
ファイルの切り出しプログラム...
-
Excelマクロ 空白セルを無視し...
-
タグ初心者
-
EXCEL→CSV保存時のダブルクォー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理 特定の文字以降を...
-
パイソンでテキストファイルが...
-
VBA テキストボックスを選択状...
-
[コンパイルエラー 修飾子が不...
-
SQLでテキストボックスの文字を...
-
Access VBA エラー2448について
-
verilog HDLについての質問です...
-
teratermで、ファイル名をinput...
-
分数の計算のプログラミングです。
-
バッチ for /f 空白、スペース...
-
MS-DOSバッチファイルコマンド...
-
アスキー変換 と 逆変換について
-
TEXTファイルを日付・時刻で保存。
-
型の値をDataGridViewセルに変換...
-
■PukiWikiの凍結解除方法を教え...
-
ruby テキストファイル書き出し...
-
フォームのResizeイベントについて
-
プログラミングによるオセロゲ...
-
バッチファイル フォルダ名をフ...
-
文字コードを指定して・・
おすすめ情報
input.txtは時にはスペース区切りのテキストで
id X,Y Z
1 8,7 9 ここ
2 2,3 6
3 4,5 8
4 3,4 5
5 8,7 8 ここ
6 8,7 10 ここ
7 8,7 3 ここ
以下続く
となっているようなときに、「ここ」という文字があるところはX,Yが同じでZの値が異なっています。その時に、
id X,Y Z
2 2,3 6
4 3,4 5
3 4,5 8
7 8,7 3 ここ
5 8,7 8 ここ
1 8,7 9 ここ
6 8,7 10 ここ
以下続く
見たく、X,YのXを基準に並び替えつつ。かつZの小さい方から大きい方へという事も可能でしょうか?