저는 다양한 데이터베이스에서 ETL을 사용하는 회사에서 일합니다. 클라이언트 컴퓨터에 2 개의 전체 히스토리 데이터 세트에 대한 패치를 작성하여 우리 서버로 전송해야합니다. 이 패치는 우리의 소프트웨어에서 호출 할 수 있도록 프로그램 적이어야합니다.큰 ASCII 파일 비교
데이터 세트는 간단한 텍스트 파일입니다. 추출을 수행하기 위해 고객의 시스템에서 실행되는 추출 소프트웨어가 있습니다. 추출 파일의 크기는 최대 3GB +까지입니다. Microsoft의 FC.exe를 사용하여 솔루션을 구현했지만 한계가 있습니다.
그때/제거 업데이트, 그 추가 된이 된 레코드를 추출하기 위해 우리 측에 펄에서 구문 분석, 비교 파일을 생성하기 위해 FC를 사용하고 있습니다.
FC는 128자를 초과하지 않는 텍스트 줄만큼 완벽하게 나를 위해 잘 작동합니다. 이 경우 출력은 비교 파일의 다음 줄에 추가되므로 추가/삭제 된 레코드로 나타납니다. 파일을 사전 처리 할 수는 있을지는 모르겠지만 시간이 엄청나게 걸릴 것입니다.
내가 Diffutils의를 사용하여 시도하지만 큰 파일에 대해 불평.
는 또한 패치 프로세스 나 자신을 구현하기 위해 몇 가지 C# 코드 장난 삼아 생각해. 이것은 작은 파일에서도 효과가 있었지만 큰 파일을 처리 할 때 끔찍하게 비효율적이었습니다 (2.8 GB 추출물에서 테스트).
이 패치 파일을 만드는 데 사용할 수있는 좋은 명령 행 유틸리티 또는 C# 라이브러리가 있습니까? ? 그것이 나 자신을 구현하는 데 사용할 수있는 알고리즘이 있습니까? 레코드가 업데이트, 추가 및 삭제 될 수 있음을 기억하십시오. (클라이언트가 레코드를 삭제하는 것이 아니라, 레코드를 삭제한다는 의미입니다.)
명확성을 위해 편집 :
나는 두 개의 서로 다른 시대에서 두 개의 별도의 데이터베이스 추출물을 비교해야합니다. 보통 이것들은 약 1 일 간격으로 떨어져있을 것입니다. 아래의 파일을 감안할 때
:
a
3
b
c
4
d
e
1
f
g
a
b
c
d
e
1
f
2
5
New.txt (이 분명히 훨씬 더 길고 훨씬 더 넓은 것)
Old.txt
예상되는 출력은 b E :
3 added
4 added
2 removed
g added
5 removed
diff.exe의 GNUWin32 버전을 사용해보십시오. 큰 파일에는 사용하지 말고 작동 할 수도 있습니다. C# 솔루션의 경우 다음과 같이 보았습니다. [link] (http://stackoverflow.com/questions/1271225/c-sharp-reading-a-file-line-by-line) –
diffutils, 내가 언급 한 것처럼, GNUWin32의 일부입니다. 이 파일은 전혀 작동하지 않습니다. 그 링크는 꽤 기본입니다.나는 이미 C#에서 파일을 읽는 방법을 이해하고있다. 문제는 어떤 시점에서든 다를 수있는 두 파일을 비교하고있다. (어떤 경우에는 쉽게 추가 될 수있다.) – rbedger
예비 테스트를 한 후에 당신은 후에 C#에서 꽤 행할 수 있습니다. 정확한 조건을 더 잘 설명하면 간략한 코드로 그 점을 증명할 수 있습니다. 예를 들어, 대략적으로 패치 프로세스 동안 수행 된 작업 (+ 최대 예상 시간)은 무엇입니까? – varocarbas