2014-07-17 2 views
0

기존 질문이 내 것과 일치하는지 확인했지만 내 실수가 있으면 본 적이 없었습니다.효율적인 방법으로 텍스트 파일을 동시에 비교

서로 비교할 두 개의 텍스트 파일이 있습니다. 하나는 임시 로그 파일이고 다른 하나는 임시 로그의 모든 내용을 수집하여 하나의 파일에 추가하는 영구 로그입니다 (로그를 마지막으로 검사하고 전체 로그의 끝에 새 줄을 추가 한 이후로 로그에 새 줄을 수집합니다.) 그러나 지점 이후 이것은 전체 로그가 상당히 커지도록 유도 할 수 있습니다. 따라서 이와 비교하여 효율적이지 않으므로이 방법에 대해 여러 가지 방법을 고려해 왔습니다.

List<String> bufferedlines = new List<string>(); 
using (StreamReader ArchiveStream = new StreamReader(ArchivePath)) 
{ 
    if (bufferedlines.Contains(ArchiveStream.ReadLine())) 
    { 

    } 
} 
:

내 첫번째 생각은 뭔가를 목록으로 문자열 (은 일반적으로 두 가지의 작은 될 것 인) 및 아카이브 로그를 통해 단순히 루프 임시 로그를 "버퍼"를하는 것입니다

이제 내가 여기에서 진행할 수있는 몇 가지 방법이 있습니다. 불일치를 저장하는 또 다른 목록을 만들 수 있고, 읽기 스트림을 닫을 수 있습니다 (나는 동시에 읽고 쓸 수 있다고 확신하지 못합니다. 내 옵션에 대한 일을 더 쉽게 할 수 있습니다). 그런 다음 추가 모드에서 쓰기 스트림을 열고 파일에 목록을 씁니다. 양자 택일로, 불일치를 버퍼링을 절단, 나는 파일을 비교하는 동안 쓰기 스트림을 열 수있는 현장에서 일치하지 않는 라인을 작성하십시오.

내가 생각할 수있는 다른 방법은 파일을 버퍼링하는 것이 아니라 스트림을 나란히 읽고 스트림을 비교하여 비교하는 것입니다. . 뭔가 같은 :

using (StreamReader ArchiveStream = new StreamReader(ArchivePath)) 
{ 
    using (StreamReader templogStream = new StreamReader(tempPath)) 
    { 
     if (!(ArchiveStream.ReadAllLines.Contains(TemplogStream.ReadLine()))) 
     { 
      //write the line to the file 
     } 
    } 
} 

나는 문제가 해결 것인지 확실하지 않다거나 첫 번째 방법보다 더 효과적 일 수 있음을, 그래서 난 사람이 통찰력이 있다면 내가 어떻게에보고, 물어 거라고 생각 말했듯 제대로 구현되었는지, 그리고 그것이 가장 효율적인 방법인지 아니면 더 나은 방법이 있는지에 대한 정보를 제공합니다.

답변

2

효과적으로 여기에 원하는 것은 다른 세트에없는 한 세트의 모든 항목입니다. 이것은 빼기를 설정하거나 LINQ 조건으로 Except입니다. 데이터 세트가 충분히 작다면 당신은 단순히이 작업을 수행 할 수 있습니다 : 물론

var lines = File.ReadLines(TempPath) 
    .Except(File.ReadLines(ArchivePath)) 
    .ToList();//can't write to the file while reading from it 
File.AppendAllLines(ArchivePath, lines); 

는,이 코드는 메모리에 임시 파일의 라인을 모두 가져가 필요, 즉 Except이 구현 얼마나 때문에. 다른 시퀀스의 일치 항목을 효율적으로 찾을 수 있도록 모든 항목에 대해 HashSet을 만듭니다.

여기에 추가해야 할 줄 수는 매우 적기 때문에 여기에서 찾은 줄이 모두 메모리에 저장되어야한다는 사실은 문제가되지 않습니다. 잠재적으로 lot the가있을 경우, 첫 번째 파일 외에 다른 파일에 파일을 쓰고 싶을 것입니다 (필요할 경우 두 파일을 함께 처리 할 수 ​​있습니다).

+0

파일의 순서가 다른 동일한 세트가있는 경우 어떻게됩니까? –

+0

@EdPlunkett 그러면 코드가 정상적으로 작동합니다. 주문은 여기에서 고려하지 않습니다. – Servy

+0

오, 오케이, 죄송합니다. 나는 OP를 면밀히 읽지 않았다. 이제 알겠다. –

관련 문제