• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ログデーターの並び替え)

ログデータの並び替え方法

このQ&Aのポイント
  • ログデータの並び替え方法を詳しく教えてください。
  • 特定の条件でログデータを並び替えるためにはどのような処理が必要ですか?
  • ログデータを並び替えるためには、sort関数を使用する必要があります。詳しい使い方を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

No が重複する場合は、ハッシュの配列などを使い複数格納する必要があります。 前回のコードを修正したので、試してみてください。 open(IN, "< $logfile") or die "$!"; my $list = <IN>; # ヘッダ行がある? my %data; while (<IN>) { my ($date, $no, $url, $mail) = split(/<>/); push @{$data{$no}}, $_; } close(IN); # $html_data をハッシュに追加 my ($date, $no) = split /<>/, $html_data; push @{$data{$no}}, $html_data; open(OUT,">$logfile") or die "$!"; print OUT $list; print OUT @{$data{$_}} foreach sort { $a <=> $b } keys %data; # 降順 { $b <=> $a } close(OUT); 補足に書かれているコードで並び替えを行う場合は、次のようにするとうまく行くかも知れません。 > ... > if($content=~/<!--mail\/\/-->(.+)<!--mail_end\/\/-->/){$html_data.=$1 . "\n";} > } > push(@data, "$html_data"); > #新たにデーターが追加された@dataの並び順を変更して、以下ログに書き込みを行いたいと思っています。 @data = map { $_->[1] } sort { $a->[0] <=> $b->[0] } map { [(split(/<>/,$_))[1], $_] } @data; > open(OUT,">$logfile"); > ...

TPR_SET
質問者

お礼

ありがとうございます。 おかげさまで並び順の変更ができました。恥ずかしながら、今の自分の知識では、教えていただいたコードを理解できないのですが、今後の為にも理解出来るように精進したいと思います。 自分では到底実装不可能だった機能拡張だったので、本当に助かりました。感謝感激です。

その他の回答 (1)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

No に重複がなければ、No を配列の添字かハッシュのキーに割り当てる方法があります。 以下はハッシュを用いた一例です。 open(IN, "< $logfile") or die "$!"; my $list = <IN>; # ヘッダ行がある? my %data; while (<IN>) { my ($data, $no, $url, $mail) = split(/<>/); $data{$no} = $_; } close(IN); open(OUT,">$logfile") or die "$!"; print OUT $list; print OUT $data{$_} foreach sort { $a <=> $b } keys %data; # 降順 { $b <=> $a } close(OUT);

TPR_SET
質問者

お礼

追記。 補足で提示したソースの処理の順番は、多分、自分の知識では変えようがないように思います。 $logfileを読み込んでから、処理の部分でログの内容と追加内容が重複していないかチェックを行い、 重複していなければ、foreachで複数データーが$html_dataに格納されるようになっています。

TPR_SET
質問者

補足

大変勉強になりました。ありがとうございます。 $noの数値は重複することがあるのですが、重複した行の並び順は特に指定する必要はありません。ただ、重複した行は上書きされてしまったようです。 それと、以下のソースに適用してみようとして試行錯誤してみましたが、何度やってもうまくいきませんでした。かなり複雑なソースのログの並び順を変更する必要があるため、必要な情報をうまく提示できなくて申し訳ございません。 use LWP::Simple; my $content = get($html); open(IN, "< $logfile"); my $list = <IN>; while(<IN>){ my ($date,$no,$url,$mail) = split(/<>/); push(@data, "$_"); } close(IN); if(条件){ if($content=~/<!--data\/\/-->(.+)<!--data_end\/\/-->/){$html_data.=$1 . "<>";} if($content=~/<!--no\/\/-->(.+)<!--no_end\/\/-->/){$html_data.=$1 . "<>";} if($content=~/<!--url\/\/-->(.+)<!--url_end\/\/-->/){$html_data.=$1 . "<>";} if($content=~/<!--mail\/\/-->(.+)<!--mail_end\/\/-->/){$html_data.=$1 . "\n";} } push(@data, "$html_data"); #新たにデーターが追加された@dataの並び順を変更して、以下ログに書き込みを行いたいと思っています。 open(OUT,">$logfile"); print OUT $list; print OUT @data; close(OUT);

関連するQ&A