2012-08-27 3 views
-1
/* format of the files:123|0|15454215|desc|11/30/2012|N|Y| 
open FILE1, "/home/1.txt" or die $!; 
open FILE2, "/home/2.txt" or die $!; 

while (<FILE2>) { 
    @old_item = split(/\|/); 
    if (<FILE1> !~ /$old_item[0]\|$old_item[1]\|$old_item[2]/) { 
    print "$old_item[0]|$old_item[1]|$old_item[2]|$old_item[3]|$old_item[4]|$old_item[5]|$old_item[6]|DE|\n"; 
    } 
} 

내가 아닌 두 번째는 다음을 출력의 첫 번째에있는 모든 줄을 찾을 수를 비교 한 후 두 파일을 여는 여기하고 있어요 오래되고 새로운 정보가 담긴 라인.

하지만 두 번째 파일에없는 행을 찾았지만 처음에는 모든 행을 인쇄하기 시작합니다. 내가 뭘 잘못하고 쉬운 방법이있다.

답변

6

diff -u 또는 일부를 사용하지 않으시겠습니까? Perl 솔루션을 원하면 Algorithm::Diff을 확인하십시오.

+0

좋은 생각이긴하지만 여기서는 애드온 모듈을 사용할 수 없습니다. (제가 일하는 회사와 관련이 있습니다) – Bill

+0

@Bill, 그래서 내 코드를 게시하면 괜찮습니다.하지만 CPAN에 게시합니다. 그렇지 않습니다. WTF! 글쎄, 나는 Algorithm :: Diff를 여기에 복사하는 것을 너무 게으르다. 그래서 나는 다른 누군가가해야 할 것이라고 생각한다. – ikegami

+0

전적으로 동의합니다. 뭔가를 얻으려면 내가 왜 우리가 그것을 필요로하는지 기재해야하고, 그것을 내 매니저에게 제출해야합니다. 그리고 그것은 제가 이것을 위해서하고 싶은 것이 아닙니다. – Bill

0

데이터를 보는 것이 유용 할 것입니다. 하지만 교훈있는 추측을하면 .. 디버거를 사용하여이 과정을 살펴 보겠습니다. 누락 된 행이 발견되면 입력의 다음 행으로 건너 뛰고 모두 스트림입니다.

이제 나머지 입력에 대해 별개의 문제가 있습니다.

+0

스트림은 무엇이 움직이고 있습니까? 문자열이 두 번째 파일에 있는지 확인하기 만합니까? 이 작업을 수행하는 더 좋은 방법은 무엇입니까? – Bill

0

발생하는 이유는 라인이 오래 동기화되지 않았다는 차이점을 발견했기 때문입니다.

일치하는 줄을 검색하여 파일 판독기를 다시 동기화해야하는 코드를 추가해야합니다.

1

필자는 각 파일을 한 행씩 읽고 있기 때문에 추가 줄을 사용하면 모든 줄이 꺼져 있기 때문에 (파일 중 하나가 한 줄 앞에 표시되므로 말할 수 있음) . 여전히 자신의 펄 코드를 작성하고 싶다면 배열 주먹에 파일을로드하고 필요할 때만 색인을 증가시키면서 비교할 수 있습니다.

1

perl의 두 파일을 비교하는 모듈이 있습니다.

알고리즘 :: DIFF 모듈

,

알고리즘 :: DIFF - 라인과 완벽하게 검사를하여 두 파일 라인을 비교하는 두 파일/목록 사이 '지능형'의 차이를 계산합니다.