2012-11-08 2 views
2

두 텍스트 파일 (+ -15000lines)을 빠르게 비교하고 두 파일에서 다른 출력 문자열을 얻는 가장 좋은 방법을 찾고 있습니다. 첫 번째 인벤토리는 오래된 인벤토리입니다. 새 인벤토리가 현재인데 file2 & file1 사이의 다른 문자열을 포함하는 세 번째 인벤토리를 생성하고 싶습니다. (두 파일 중 95 %가 비슷합니다.)C# 두 텍스트 파일을 비교하여 차이가있는 새 파일을 생성하십시오.

+0

이 경우 "비슷한"의미가 무엇인지 설명해 주실 수 있습니까? 그리고 프로그래밍 방식으로이 작업을 수행해야합니까, 아니면 [WinMerge] (http://winmerge.org)와 같은 diff 작업을 수행하기를 원하십니까? – Groo

+0

주로 같은 순서로 동일하지만 항목이 누락 될 수 있습니다. 목표는 프로그래밍 방식으로 수행하는 것입니다. 감사합니다. – OwenS

답변

1

출력 순서가 같은 경우에는 직접 줄을 비교하십시오. 다른 파일에 값이없는 경우 줄을 건너 뛰어야 할 수 있습니다.

그러나 출력이 같지 않은 경우 파일을 메모리에로드하고 한 파일에서 다른 파일로 관련 인벤토리 항목을 조회해야 할 수 있습니다. 그런 다음 찾지 못하거나 다를 때 필요한 것을하십시오. 는 유사한동일한 의미한다고 가정

+0

+1 주문이 변경되지 않은 경우 알고리즘은 매우 간단하고 효율적이어야합니다. – Groo

+0

인벤토리에는 주로 매개 변수가있는 디렉토리 목록이 포함되어 있습니다. 파일이 제거 된 경우 누락 된 항목이 있지만 순서는 동일합니다. 감사합니다. – OwenS

7

아주 간단한 방법은 :

var file1Lines = File.ReadLines(file1Path); 
var file2Lines = File.ReadLines(file2Path); 
IEnumerable<String> inFirstNotInSecond = file1Lines.Except(file2Lines); 
IEnumerable<String> inSecondNotInFirst = file2Lines.Except(file1Lines); 

넌 라인을 열거 foreach를 사용할 수있다.

+0

OP가 올바른 것으로 가정하면 – Hardrada

+0

을 upvote합니다. 예를 들어 ToList()를 통해 쿼리를 구체화하거나 원하는 경우 'ObjectDisposedException'을 피하기 위해'File.ReadAllLines'를 사용해야합니다. 두 시퀀스를 모두 사용하십시오. 'File.ReadLines'은 라인을 스트리밍하고 일단 완료되면 기본 스트림이 닫힙니다. 그럼에도 불구하고'ReadLines'는 메모리 소비면에서 가장 좋은 선택이기 때문에 보여주고 있습니다. –

+0

ReadLines & ReadAllLines간에 성능 차이가 있습니까? 15000l의 파일에 차이가 없다면 readAllLines을 사용할 것입니다. 감사합니다. – OwenS

1

Google의 this diff 라이브러리를 사용할 수 있습니다. 2 개의 문자열을 취하고 차이 목록을 반환하는 diff_main 메서드를 살펴보십시오.

관련 문제