ハッシュを利用して今ソートできるプログラムを作成したのですが、
重複するデータは除外されてしまうようで、どうしたら除外されずに
ソートできるかを教えていただきたいです。
<例> 文字 よみ No
橋 はし 1
橋 はし 3
箸 はし 2
というデータがあったとして、今のプログラムを実行すると・・・
<結果> 箸 はし 2
キーがよみなので3番目のデータだけ残ります。キーを漢字に
したとしても1番目のデータは残らないのですが、どうしてらよいのでしょうか。
<理想的な結果>
橋 はし 1
箸 はし 2
橋 はし 3
一番いいのが上のような結果で、Excelのソートのような感じで、第1キーはよみで第2キーはNoとかのソートはPerlでできないでしょうかね??
どなたか分かる方がいたら教えていただきたいです。
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
$form_file = "sort2.log";
$to_file = "sort2.txt";
open(F1, $form_file) || die "$form_file をオープンできません:$!\n";
open(F2, ">$to_file") || die "$to_file を作成できません:$!\n";
foreach(sort useSort <F1>){
print F2 $_;
}
close(F2);
close(F1);
sub useSort{
(split(/\t/,$a))[1] cmp (split(/\t/,$b))[1] ||
(split(/\t/,$a))[2] <=> (split(/\t/,$b))[2]
}
多分こんな感じになるんじゃないですかね。
<F1>の中身が下のようになっていたらのお話です。
橋\tはし\t2
橋\tはし\t1
橋\tはし\t3
この回答への補足
返事遅くなって申し訳ありません。
プログラムやってみました。上手くソートができていました。
しかし、プログラムがいまいち分からないので、今後の勉強の為にも
もうちょっと詳しく教えていただきたいです。
foreach(sort useSort <F1>){
print F2 $_;
}
close(F2);
close(F1);
sub useSort{
(split(/\t/,$a))[1] cmp (split(/\t/,$b))[1] ||
(split(/\t/,$a))[2] <=> (split(/\t/,$b))[2]
}
の意味を教えていただきたいです。よろしくお願いします。
No.4
- 回答日時:
#3>Noについての
Noは、どのように決定するのでしょうか?
置換前のファイルに手入力で追加するのですか?
現在のような
$mozi{$yomi} = "$mein";
では、同じ読みが1つしか保存されません
$mozi{'はし'}=['橋','箸','端'];
みたいな構造、(位置がNoをあらわす)とするか
$mozi{'はし'}=[['橋',1],['箸',2],['端',3]];
のような構造がいいかもしれません。
ところで、例のように
橋 はし 1
橋 はし 3
みたいに同じ文字、同じ読みで違うNoが付くことはあるんですか
この回答への補足
文字の保存の仕方がいけないのですね・・・。少し考えてみます。
ありがとうございます。
同じ文字でNoが違うバージョンはたくさんあるんですよね。
それがなかったら、簡単にできるんですが。
No.3
- 回答日時:
ハッシュでどんな風にデータが格納されているんでしょうか?
「ソートできるプログラムを作成した」を補足で挙げられますか?
この回答への補足
print"置換元のファイル名を指定ください:";
$form_file = <STDIN>;
print"置換後のファイル名を指定してください:";
$to_file = <STDIN>;
chomp($form_file, $to_file);
open(F1, $form_file) || die "$form_file をオープンできません:$!\n";
open(F2, ">$to_file") || die "$to_file を作成できません:$!\n";
while ($line = <F1>) {
chomp $line;
($mein, $yomi) = split (/\t/, $line);
$mozi{$yomi} = "$mein";
}
foreach $value (sort keys %mozi) {
print F2 "$mozi{$value}\t$value\n";
}
作成してみたのが、これです。
まだNoについてのプログラムはわからないので作成できていませんが・・
できますかね??よろしくお願いします
No.2
- 回答日時:
#!/usr/local/bin/perl
use strict;
my @DATA = (
[ '橋', 'はし', 1 ],
[ '橋', 'はし', 3 ],
[ '箸', 'はし', 2 ],
);
@DATA = sort { $a->[2] <=> $b->[2] } sort { $a->[1] cmp $b->[1] } @DATA;
for (@DATA) {
print $_->[0] . $_->[1] . $_->[2] . "\n";
}
exit;
検証していませんので自信はないです:)
No.1
- 回答日時:
がると申します。
んっと……記述されているデータだけを考えると単純に「Noをキーにしてソート」で片付くと思うのですが。
もし「それじゃNG」なようであれば、もう少し細かく「ソート条件」を教えていただければ、多分返答できるかと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perl のソート関数
-
VB2010 DataGridからmdb更新
-
Access VBAで行ラベルが定義さ...
-
VBA プロシージャの名前の取得
-
ストアドプロシジャからストア...
-
【Excel VBA】 WorksheetやRa...
-
Statement ignored というエラー
-
PL/SQLでSPOOLさせたいのですが...
-
全角空白のTRIMができない...
-
Accessのマクロでモジュールを...
-
PL/SQLカーソルの2重FORループ...
-
date型のインデックス
-
sqlplusでヘッダーが付かない
-
SQLで部分的にGROUP BYしたいとき
-
SQL*Loader フォーマット変換...
-
excelマクロで意図通りのソート...
-
時間項目を60進数から10進数へ...
-
sqlplusのspoolで空白行出現
-
日付型カラムへのデータINSERT
-
callで順に実行されるプロシー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
access adoのトランザクション
-
VB + oracle oo4o でのトラン...
-
gitでコミットするタイミングが...
-
ExecuteSQLについて
-
トランザクション実行のステータス
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
エクセルVBAでUserFormを起動し...
-
Statement ignored というエラー
-
キャッシュを使わずにSELECTを...
-
VBA プロシージャの名前の取得
-
sqlplusでヘッダーが付かない
-
SQL*Plusの終了はquit?exit?
-
callで順に実行されるプロシー...
-
ODBCリンクの際にACCESSでは読...
-
SQLサーバで和暦から西暦に変換...
-
【Excel VBA】 WorksheetやRa...
-
全角空白のTRIMができない...
-
PL/SQLカーソルの2重FORループ...
-
Accessの数値から時間に変換す...
おすすめ情報