2009-05-04 6 views
0

多くの関連する質問が表示されますが、この特定のシナリオには答えられませんでした。ループ中にリアルタイムでPerlで重複した項目の出力を防ぐ最良の方法

SQL select文から生成された結果セットを解析するwhile/forループの間に、同じフィールドデータが含まれている場合に次の行が出力されないようにする最良の方法は何ですか?第1フィールドまたは第xフィールド)?例えば

、2つの行があった場合:

('EML-E','[email protected]','John','Smith') 
('EML-E','[email protected]','John','Smith') 

「EML-E」の両方の行に同じであるという事実に基づいて、最初の行だけを印刷するための最良の方法は何ですか? dupecatch場合は[0]をチェック

  • ([1]をdupecatch)2要素の配列に(私のシナリオに固有の)最初のフィールドを保存する

    • 今、私はこれをやっています= [1](複製 - 's' を使用してループを脱出)dupcatch、処理dupecatch設定されている行の後

    • [0] = dupecatch [1]

      while ($DBS->SQLFetch() == *PLibdata::RET_OK) 
      { 
          $s=0; #s = 1 to escape out of inside loop 
          while ($i != $array_len and $s==0) 
          { 
           $rowfetch = $DBS->{Row}->GetCharValue($array_col[$i]); 
           if($i==0){$dupecatch[1] = $rowfetch;} #dupecatch prevents duplicate primary key field entries 
           if($dupecatch[0] ne $dupecatch[1]) 
           { 
            dosomething($rowfetch); 
           } 
           else{$s++;} 
           $i++; 
          } 
          $i=0; 
          $dupecatch[0]=$dupecatch[1]; 
      } 
      
  • +2

    なぜwhileループで型グロブを使用していますか? –

    +0

    thatsモジュールの仕組みthats ...私はPlibdataについてよく分かりません。なぜなら、それは動作するからです。 – CheeseConQueso

    答えて

    7

    これは、行の中の重複した項目のみを気にするならば、標準的な方法ですが、通常$ dupecatch [0]は通常$ oldと$ dupecatch [1]という名前の変数です。あなたはそのインデックスを参照するだけなので、配列が適切ではないと言うことができます。

    あなたは%見ハッシュを使用することができ、すべての重複を回避したい場合:

    my %seen; 
    while (defined (my $row = get_data())) { 
        next if $seen{$row->[0]}++; #skip all but the first instance of the key 
        do_stuff(); 
    } 
    
    +0

    意味があります... whats%has hash about all? – CheeseConQueso

    +0

    ああ、なぜ私は配列と一緒に行ったのか覚えていますが、whileループのすべての反復で$ rowfetchの変更があります。なぜ私は内側のループが完了した後に古い値を設定します。私は2つの変数を使用することができましたが、配列はよりよく見えました – CheeseConQueso

    +1

    配列はコレクションとして使用されるほうがほんとうです。そのインデックスでのみ使用しているため、コレクションとして使用していません。 $ oldという名前の変数は、より説明的です。 答えに%seenハッシュの例を示します。 –

    1

    私はあなたのSQL文でDISTINCT使用して示唆しています。これはおそらく最も簡単な修正です。

    +0

    要件(重複している連続した重複行)に基づいて、それは間違いでしょう:distinctは、( "foo"、 "bar"、 "foo"、 "foo")から "foo"最後のものだけを削除する必要があります。 –

    +0

    最初の2つの選択肢でdistinctを使用していますが、私はそれを想定した方法で動作させたい場合、2番目の選択肢を一時表にダンプしてから別のものを選択する必要があります。あまりにも多くの一時テーブルが私の最大の関心事ではないことがわかった。 – CheeseConQueso

    関連する問題