お世話になります。
次の様な内容ファイルを読込み
=====================
"No""accessday"
"1""2007/1/10"
"2""2007/1/2"
"3""2007/1/5"
"4""2007/1/11"
=====================
日付の降順に並替えて下記のように表示したい場合
=====================
"No""accessday"
"4""2007/1/11"
"1""2007/1/10"
"3""2007/1/5"
"2""2007/1/2"
=====================
どの様なコードを書けばよいのでしょうか。
出来れば簡単なコーディング例などで解説お願いします。
No.1ベストアンサー
- 回答日時:
#!/usr/local/bin/perl
open FILE, 'test.txt';
@lines = <FILE>;
close FILE;
@sorted_lines = sort {sort_value($b) cmp sort_value($a)} @lines;
print @sorted_lines;
exit;
sub sort_value
{
if($_[0] =~ m|"(\d+)/(\d+)/(\d+)"|){
return sprintf("%04d%02d%02d",$1,$2,$3);
}else{
#タイトル行は先頭に来るように
return '99999999';
}
}
ソート用の関数で日付の桁をそろえて、それを元にsortしてます。
"2007/1/10" → "20070110"
"2007/1/2" → "20070102"
こんな感じでどうでしょう?
あっそうか!と気がつきました。
元データを作成するときに
$accessday = sprintf("%04d/%02d/%02d", $year, $mon, $mday)
として、2007/1/2" ではなく "2007/01/02" と保存するように
変更しました。
これでソートしてばっちりでした。
ありがとうございました。
No.2
- 回答日時:
sort のブロックの中で何度も同じ処理を行うのはソート対象のデータ数が多いと
処理時間に利いてきますので、こういうやり方もあるよということで。
#Schwartzian Transformは自粛
use strict;
use warnings;
my @data = <DATA>;
my $header = shift @data;
my %work_for_sort;
foreach (@data) {
my ($year, $month, $day) = m{"(\d+)/(\d+)/(\d+)"};
if (defined $year && defined $month && defined $day) {
my $l = sprintf "%04d%02d%02d", $year, $month, $day;
$work_for_sort{$_} = $l;
}
}
my @sorted = sort { $work_for_sort{$b} cmp $work_for_sort{$a} } @data;
print $header;
print @sorted;
__END__
"No" "accessday"
"1" "2007/1/10"
"2" "2007/1/2"
"3" "2007/1/5"
"4" "2007/1/11"
ご回答ありがとうございました。
2通りの回答例を見せていただきましたが、
シンプルに元データを
"2007/1/5" なら "2007/01/05"と保存するようにして
ソートをかけるという様にしました。
またよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelの並び替え(先頭の文字以外を基準に並び替えたい) 3 2023/07/07 22:21
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける 3 2022/09/10 07:55
- Visual Basic(VBA) Excel VBAで並べ替えをしたい 3 2023/02/25 09:31
- Perl Perlで特定文字列から特定文字列までを抜き出したい 4 2022/04/02 14:24
- その他(開発・運用・管理) 複数ファイル名の一括変更について 3 2023/04/27 13:08
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける (再質問) 4 2022/09/14 22:51
- その他(Microsoft Office) 1の行を固定した上でVBAを用いて日付順に自動並べ替え 2 2022/06/06 15:09
- Excel(エクセル) Excelで漢字人名が勝手に並び変わる 2 2023/01/14 22:14
- その他(プログラミング・Web制作) 【python】Excelファイルを読み込む際の日付の表示形式を任意にする 2 2022/11/24 14:21
- Excel(エクセル) Excelのマクロについてご教授ください 2 2023/02/25 09:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perl-cgi 文字の長さでソートし...
-
データの日付でソートをしたい
-
openした後、closeしないでプロ...
-
コマンドプロンプトからperlを...
-
エクセルVBA コードが同じでも...
-
Perlでエラーログに日時をつける
-
perlで容量の大きいCSVファイル...
-
VBAでCSVファイルの特定行を書...
-
DOSコマンドで、標準出力を出力...
-
ジョブショップスケジューリング
-
htaccessで特定のディレクトリ...
-
requireで同じライブラリを複数...
-
C言語で特定の行を抽出する方法...
-
batファイルでrenameができませ...
-
タブの色を変更する方法
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルを途中行まで...
-
VBを使ってのCD-RWへのバックア...
-
window.open でのファイル指定方法
-
perlで、後ろの行を読んで、前...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の中に重複文字列があるか...
-
C言語のバイナリモードでのfsca...
-
データの日付でソートをしたい
-
perlで複数行のデータを自由に...
-
perl-cgi 文字の長さでソートし...
-
Visual C++を用いたシリアル通信
-
バッチファイルの作り方(CSV→...
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルの特定行を書...
-
DOSコマンドで、標準出力を出力...
-
ExcelをCSV書き出す場合のシー...
-
openした後、closeしないでプロ...
-
close()で例外が投げられる理由
-
batファイルでrenameができませ...
-
VBAでCSVファイルを途中行まで...
-
VBAで巨大なファイルの途中から...
-
window.open でのファイル指定方法
-
Perlで特定行から特定行までを...
-
ReadLineでの読み出し行を指定する
-
エクセルVBAで素数だけを出力す...
おすすめ情報