15(tab)5634(改行)
24(tab)4446(改行)
24(tab)8357(改行)
24(tab)3287(改行)
56(tab)5465(改行)
56(tab)1324(改行)
56(tab)7544(改行)
上記のように1行にtabで区切られた2つの数値が並んでいるテキストファイルがあります。
このファイルを、Rubyを使って1列目が同じ数字の行ごとにソートしたいのですが、できなくて困っています。
上の例でしたら、1列目が24の3行を2列目の数値をキーとしてソート、1列目が56の3行を2列目の数値をキーとしてソートするということです。
一行ずつ読み込んで、array = line.split(/\t/)でタブでくぎって配列に格納するスクリプトを書いていたのですが、どうしてもできないので、力を貸していただけないでしょうか。
よろしくお願いします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
ご質問から1列目は小さい順に並べられているものと仮定します。
また、入力データが"input.txt"というファイルに格納され、
出力データを"output.txt"にしているとすると、
以下のようなスクリプトで実行できると思います。
(字下げがなくなっているので、見にくいとは思いますが、ご了承ください)
in1_file=open("input.txt","r")
out1_file=open("output.txt","w")
# 初期値設定
in1_ctr=0#入力件数
w_ctr=0#ソート件数
in1_key=nil#入力キー
in1=nil#入力した配列
in1_rec=Array.new#入力キー
sv_key=nil#保存キー
# キーブレイク時の処理
defs_break(in1_rec,out1_file)
sort_rec=in1_rec.sort_by{|a|
a_array=a.split("\t",-1)
[a_array[1]]
}
sort_rec.each {|data|
out1_file.printdata,"\n"
}
end
# 主処理
while(line1=in1_file.gets)
line1.chomp!
in1=line1.split("\t")
in1_key=in1[0]
in1_ctr+=1
# キーブレイク時
if((in1_ctr!=1)&&(sv_key!=in1_key))
s_break(in1_rec,out1_file)
w_ctr=0
in1_rec=[]
end
sv_key=in1_key
in1_rec[w_ctr]=line1
w_ctr+=1
end
# 最終データの処理(入力データがある場合)
if(in1_ctr!=0)
s_break(in1_rec,out1_file)
end
# ファイルクローズ
in1_file.close
out1_file.close
あるいは、1列目を第1のキー、2列目を第2のキーとして昇順に並べ替えてもよいのであれば、
以下のようなスクリプトになります。
in1_file = open("input.txt","r")
out1_file = open("output.txt","w")
in1_ctr = 0
in1_rec = Array.new
sort_rec = Array.new
while (line1 = in1_file.gets)
line1.chomp!
in1_rec[in1_ctr] = line1
in1_ctr += 1
end
sort_rec = in1_rec.sort_by{|a|
a_array = a.split("\t",-1)
[a_array[0].to_i,a_array[1].to_i]
}
sort_rec.each {|data|
out1_file.print data,"\n"
}
in1_file.close
out1_file.close
上記で、"[a_array[0].to_i,a_array[1].to_i]"としている箇所が整数で1列目を第1キーに、同じく整数で2列目を第2キーに指定している部分です。ご質問の例では、1列目と2列目でそれぞれ数字の桁数が同じでしたので、仮に「文字列型」として並べ替えても良いのであれば、"[a_array[0],a_array[1]]"とすることもできます。
参考URL:http://www003.upp.so-net.ne.jp/NAMBOKU/ruby/ruby …
No.4
- 回答日時:
1列目はソートしたくないということと理解しました。
(インデントされないようなので見難くてすみません)
array = []
old = nil
while line = gets
group, key = line.chomp.split(/\t/)
unless old == group
array.sort_by{|a|a.to_f}.each do |k|
puts [old,k].join("\t")
end
old = group
array = []
end
array << key
end
array.sort_by{|a|a.to_f}.each do |k|
puts [old,k].join("\t")
end
No.3
- 回答日時:
各カラムの数字の桁数が例示のように各行固定なら、
puts IO.readlines("ファイル名").sort
でいいのでは?
各カラムが2文字4文字と固定長とは限らず、文字列としてで無く数値として比較しないといけないとすると、
puts IO.readlines("ファイル名").sort_by{|line| line.chomp.split(/\t/).map{|x| x.to_i }}
No.2
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 結合セルのソートについて 5 2022/04/22 11:57
- マウス・キーボード Tabキーとテンキーが右側にあるワイヤレスキーボード を探しています。 仕事上数字を入力することが多 3 2022/09/22 21:13
- Visual Basic(VBA) vbaでセルに入力したときに,その横にあるセルを保護し入力不可にするマクロを作りたいです。 2 2022/04/24 20:59
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- Visual Basic(VBA) 改行ごとに行を追加し、数量を分割 4 2023/07/11 16:39
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# プログラムについて。 4 2023/07/19 13:43
- モニター・ディスプレイ Win11マルチディスプレイでの異なる仮想デスクトップの表示 3 2023/02/01 10:02
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pythonのエラーについて
-
【fortran77】空行を含む数値デ...
-
バッチ処理 特定の文字以降を...
-
【ExcelVBA】300万件越えCSVか...
-
VBA csvファイルのデータを...
-
ダブルコーテーション付きでCSV...
-
[コンパイルエラー 修飾子が不...
-
VBAで複数のCSVからレコードセ...
-
エクセルVBA Application.GetSa...
-
CSVデータの文字列置換
-
VBAでcsvファイルもシートもあ...
-
vbaマクロについて 次のような...
-
pythonでリストをCSVに出力する...
-
fortranでデータの抜き出しをし...
-
バッチコマンドで指定行を抽出...
-
Excelマクロ 空白セルを無視し...
-
CSVで余計な空行が入る
-
verilog HDLについての質問です...
-
SQLファイルの読み込み
-
pythonまたはrubyでの複数ファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fortranでNAのあるデータを読み...
-
Fortran:列数の分からないデー...
-
pythonのエラーについて
-
【ruby】flockで掛けたロックを...
-
pycharmへのpysamインストール...
-
【fortran77】空行を含む数値デ...
-
rubyの見えない文字
-
rubyプログラムでのフォルダ内...
-
2行読み込んで一行戻り、また2...
-
ギャスケット作成。修正の解説...
-
バッチ処理 特定の文字以降を...
-
Excelマクロ 空白セルを無視し...
-
【ExcelVBA】300万件越えCSVか...
-
VBAでcsvファイルもシートもあ...
-
ダブルコーテーション付きでCSV...
-
[コンパイルエラー 修飾子が不...
-
VBA テキストボックスを選択状...
-
Access VBA エラー2448について
-
INPUTタグ disabledの文字色を...
-
EXCEL→CSV保存時のダブルクォー...
おすすめ情報