2016-07-07 6 views
-1

私はソートされたデータを2つの列に基づいて降順で引き出し、このデータをテキストファイルにデータファイルを埋め込むテキストファイルに出力します。私が実行している問題は、プログラムに読み込まれたのと同じ順序で出力が生成されないということです。ここプログラムのアウトファイルの順序を修正する方法はありますか?

は、データセットのサンプルである:ここ

2, 1, 20, 1, 10, 28.5714285, 0, 
2, 1, 72, 3, 7, 20, 0, 
2, 2, 20, 3, 19, 52.7777777, 0, 
5, 1, 66, 3, 199, 21.1927582, 0, 
5, 1, 5, 2, 153, 16.2939297, 0, 

は次出力からのサンプルである:

fci 
u 
csno=51 svgrp=0 antfc= 2 
cdmanbr_list1.ncs_c[1]= 51 
cdmanbr_list1.nghbrantf[1]= 1 
cdmanbr_list1.pilot_pn[1]= 
cdmanbr_list1.pgn_c[1]= 0 
u 
u 
csno=66 svgrp=0 antfc= 2 
cdmanbr_list1.ncs_c[1]= 66 
cdmanbr_list1.nghbrantf[1]= 1 
cdmanbr_list1.pilot_pn[1]= 
cdmanbr_list1.pgn_c[1]= 0 
u 
u 
csno=51 svgrp=0 antfc= 3 
cdmanbr_list1.ncs_c[1]= 51 
cdmanbr_list1.nghbrantf[1]= 1 
cdmanbr_list1.pilot_pn[1]= 
cdmanbr_list1.pgn_c[1]= 0 
u 

お知らせ方法第三「のCsNO」の値(51 )が第2の「csno」値(66)よりも小さい。同じ値の2つの "csno"があっても、 "antfc"の値は異なります。所望の出力は以下の通りです:ここでは

fci 
u 
csno=51 svgrp=0 antfc= 2 
cdmanbr_list1.ncs_c[1]= 51 
cdmanbr_list1.nghbrantf[1]= 1 
cdmanbr_list1.pilot_pn[1]= 
cdmanbr_list1.pgn_c[1]= 0 
u 
u 
csno=51 svgrp=0 antfc= 3 
cdmanbr_list1.ncs_c[1]= 51 
cdmanbr_list1.nghbrantf[1]= 1 
cdmanbr_list1.pilot_pn[1]= 
cdmanbr_list1.pgn_c[1]= 0 
u 
u 
csno=66 svgrp=0 antfc= 2 
cdmanbr_list1.ncs_c[1]= 66 
cdmanbr_list1.nghbrantf[1]= 1 
cdmanbr_list1.pilot_pn[1]= 
cdmanbr_list1.pgn_c[1]= 0 
u 

は、プログラムのコピーです:

#!/usr/bin/perl 
use POSIX qw(strftime); 

($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = 
    localtime(time); 

my $bdate = sprintf("%02d%02d%02d", $mon + 1, $mday - 7, $year - 100); 
my $edate = sprintf("%02d%02d%02d", $mon + 1, $mday - 1, $year - 100); 

my $newresult = "/home/user/newresults/recommended_$bdate-$edate.csv"; 
my $script = "/home/user/update_scripts/update_$bdate-$edate.txt"; 

my $h; 
my $k; 
my $n; 
my $fh = undef; 
open($fh, '<', $newresult) or die $!; 
open($fsh, '>', $script) or die $!; 
print $fsh "fci\n"; 
while (my $line = <$fh>) { 
    next if $. < 2; 
    chomp $line; 
    my @array = split(/\,/, $line); 
    my $key = "csno=$array[0] svgrp=0 antfc=$array[1]"; 
    push(@{ $h->{$key} }, $array[6]); 
    push(@{ $k->{$key} }, $array[2]); 
    push(@{ $n->{$key} }, $array[3]); 
} ## end while (my $line = <$fh>) 

foreach my $key (keys %{$h}) { 
    print $fsh "u\n"; 
    print $fsh "$key\n"; 
    if (@{ $h->{$key} } <= 12) { 
     for (my $i = 1 ; $i <= @{ $h->{$key} } ; $i++) { 
      my $m = $i - 1; 
      print $fsh "cdmanbr_list1.ncs_c[$i]=${$k->{$key}}[$m]\n"; 
      print $fsh "cdmanbr_list1.nghbrantf[$i]=${$n->{$key}}[$m]\n"; 
      print $fsh "cdmanbr_list1.pilot_pn[$i]=\n"; 
      print $fsh "cdmanbr_list1.pgn_c[$i]=${$h->{$key}}[$m]\n"; 
     } ## end for (my $i = 1 ; $i <=...) 
     for (my $i = @{ $h->{$key} } + 1 ; $i < 13 ; $i++) { 
      my $m = $i - 1; 
      print $fsh "cdmanbr_list1.ncs_c[$i]=\n"; 
      print $fsh "cdmanbr_list1.nghbrantf[$i]=\n"; 
      print $fsh "cdmanbr_list1.pilot_pn[$i]=\n"; 
      print $fsh "cdmanbr_list1.pgn_c[$i]=\n"; 
     } ## end for (my $i = @{ $h->{$key...}}) 
    } ## end if (@{ $h->{$key} } <=...) 
    print $fsh "u\n"; 
} ## end foreach my $key (keys %{$h...}) 
+2

* *私は* outfiling *のを聞いたことがない、そしてどのようにデータを差し込む「OUTFILE」あなた、このテキストファイルはありません別のテキストファイルですか? – Borodin

+2

あなたが書いたすべてのPerlプログラムのトップに、特にそれを公開して助けを求める前に、常に 'use strict'と' use warnings 'all''を*使用してください。 'my'宣言を' use strict'なしですべて打ち込むのはちょっと難しいです – Borodin

答えて

0

あなたの問題の原因は

foreach my $key (keys%{$h}){ 

にあなたがその鍵を期待しているということですハッシュのいくつかの事前定義された順序になります。それはハッシュの仕組みではありません。

2合理的な解決策は以下のとおりです。

  • (努力のために最適化)あなたが望むように、入力ファイルがソートされている知っている場合は、あなたの代わりにそれの上に%$hとinterrateを構築しているとして、配列に$keyを押してください。すなわち

    foreach my $key (@keyorder) {

  • (メモリ最適化)して、キーの(明らかに)ソートされていないリストを取り、並べ替え:あなたの比較はの形を取るかもしれない

    foreach my $key (sort { ### comparison here ### } keys %{$h}) {

((split $a, /=/)[1] <=> (split $b, /=/)[1]) || ((split $a, /=/)[-1] <=> (split $b, /=/)[-1])は、ソート要件の詳細によって異なります。


CスタイルのループはPerlで動作しますが、内部ループはいくつかの慣用的なPerlから利益を得ることができます。 「テキストファイルにデータを差し込むテキストファイルにしてoutfilesこのデータ」

for my $i (1 .. @{$h->{key}}) { 
    #stuff 
} 
for my $i (@{$h->{key}}+1 .. 12) { 
    #other stuff 
} 
+0

'$ $ h'のように' $ key'という文字列を配列にプッシュするとどうなりますか?これはどうやってできますか?私は助けに感謝します! –

+0

@ m.lochheadあなたは既にビルドプロセスで3回複雑なプッシュをしているので、自分でpush @keyorder $ key;を思いついたと思います。 – tjd

+0

ああ、私はdidntです私はこれに近づくべきかどうかを特定の方法があるかどうかを知る。どうもありがとうございました! –

関連する問題