2014-05-15 2 views
1

다음과 같은 파일이 있습니다.공통 필드를 사용하여 여러 행을 한 행에 병합

1111|p1 
1111|p2 
1111|p3 
1111|p4 
1111|p5 
1111|p6 
2222|p1 
2222|p2 

등등 ..

한명 (1111)의 행 당 하나 개의 제품이있다.

나는 그렇게 P5이 허용 된 경우에만 개까지 하나의 행에 대해, 남은 ROW2에 와야한다

1111|row1|p1|p2|p3|p4|p5 
1111|row2|p6 
2222|p1|p2 
3333|p1|p2|p3 

아래와 같이 출력이 필요합니다. 펄에서 이런 식으로 출력하는 것을 도와주세요.

+0

어떤 경우에 "1111 | P7은"일부 2222s 이후에 나타 납니까? 다른 사람과 합병 되든 안되나요? 그렇다면 출력물을 정렬 할 수 있습니까? 아니면 파일에서 제품의 첫 번째 모습이어야합니까? – ysth

+0

은 "행 1"과 "행 2"를 말 그대로 원하는 것입니까? – ysth

+0

row1과 row2는 사람마다 행 번호를 계산하는 것일 수 있습니다. 모든 숫자가 정렬되므로 나중에 1111이 나타나지 않습니다. – user2416763

답변

4

각 사람을 위해 제품을 저장하는 배열의 해시를 사용

#!/usr/bin/perl 
use warnings; 
use strict; 

my %owns; 
while (<DATA>) { 
    chomp; 
    my ($person, $product) = split /\|/; 
    push @{ $owns{$person} }, $product; 
} 

for my $person (keys %owns) { 
    my @products = @{ $owns{$person} }; 
    if (@products > 5) { 
     my $row = 1; 
     while (@products) { 
      my @five = splice @products, 0, 5; 
      print join '|', $person, "row$row", @five; 
      print "\n"; 
      $row++; 
     } 
    } else { 
     print join '|', $person, @products; 
     print "\n"; 
    } 
} 


__DATA__ 
1111|p1 
1111|p2 
1111|p3 
1111|p4 
1111|p5 
1111|p6 
2222|p1 
2222|p2 
+0

감사합니다.이 방식은 내가 원하는 방식으로 작동합니다. – user2416763

+0

또는 idiomatically, for (my $ row = 1; @products; ++ $ row) {' – ysth

+0

@ysth,'while'-solutions은 나에게 유기농으로 보이지만 그 의도는 분명합니다. –

0

아무것도 영리하려고 프로그래머보다 더 나쁜 없습니다.

use strict; 
use warnings; 

my $data = do {local $/; <DATA>}; 

$data =~ s{^((\d+)\|.*\n(?:\2\|.*\n)+)}{ 
    my ($whole, $header) = ($1, $2); 
    my @nums = map {/\|(.*)/} split "\n", $whole; 
    my $return = ''; 
    if (@nums > 5) { 
     for (my $i = 1; @nums; $i++) { 
      $return .= join('|', $header, "row$i", splice @nums, 0, 5) . "\n"; 
     } 
    } else { 
     $return = join('|', $header, @nums) . "\n"; 
    } 
    $return; 
}emg; 

print $data; 

__DATA__ 
1111|p1 
1111|p2 
1111|p3 
1111|p4 
1111|p5 
1111|p6 
2222|p1 
2222|p2 

출력 :

그러나, 다음과 같은 필터를 수행하는 정규 표현식을 사용

1111|row1|p1|p2|p3|p4|p5 
1111|row2|p6 
2222|p1|p2 
관련 문제