루프 중에 실시간으로 Perl에서 중복 품목의 출력을 방지하는 가장 좋은 방법

StackOverflow https://stackoverflow.com/questions/820423

  •  03-07-2019
  •  | 
  •  

문제

나는 많은 '관련'질문이 나타나지만이 특정 시나리오에 대한 답을 보지 못했습니다.

SQL Select 문에서 생성 된 결과 세트를 구문 분석하는 루프의 경우/for 루프 동안, 동일한 필드 데이터가 포함되기 전에 라인이 동일한 필드 데이터를 포함하기 전에 다음 줄이 출력되는 것을 방지하는 가장 좋은 방법은 무엇입니까? Xth 필드)?

예를 들어 두 행이면 다음과 같습니다.

('EML-E','jsmith@mail.com','John','Smith')
('EML-E','jsmith2@mail.com','John','Smith')

'eml-e'가 두 행에서 동일하다는 사실에 따라 첫 번째 행 만 인쇄하는 가장 좋은 방법은 무엇입니까?

지금은 이것을하고 있습니다.

  • 첫 번째 필드 (내 시나리오에 따라)를 2 요소 배열에 저장합니다 (dupecatch [1])
  • dupecatch를 확인하기 [0] = dupcatch [1] (중복 - 's'를 사용하여 탈출 루프)
  • 행이 처리 된 후 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];
    }
    
도움이 되었습니까?

해결책

즉, 중복 항목에만 적용되는 경우 표준 방식이지만 $ dupecatch [0]의 일반적으로 $ old and $ 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();
}

다른 팁

SQL 문에서 구별을 사용하는 것이 좋습니다. 그것은 아마도 가장 쉬운 수정 일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top