행별로 2 개의 csv (거대한 파일)를 비교하고 차이 행을 별도의 파일에 써야합니다. 한 파일의 행은 두 번째 파일의 어느 곳에 나있을 수 있습니다. 전체 행을 비교해야합니다. 포인터가 있습니까? 신속하고 더러운두 개의 큰 CSV 파일을 비교하고 차이점 파일을 얻는 방법
답변
:
private void DoSomething()
{
var lines1 = File.ReadAllLines(@"file1.csv");
var lines2 = File.ReadAllLines(@"file2.csv");
var diff1From2 = FindDifferences(lines1, lines2);
var diff2From1 = FindDifferences(lines2, lines1);
var diffs = new List<string>(diff1From2);
diffs.AddRange(diff2From1);
File.WriteAllLines(@"file3.csv", diffs);
}
private static string[] FindDifferences(string[] linesFirst, string[] linesSecond)
{
return (from line1 in linesFirst
let isLineEqual = linesSecond.Any(line2 => line1 == line2)
where isLineEqual == false
select line1).ToArray();
}
이 솔루션은 대용량 CSV 파일에서 매우 비효율적 일 수있는 O (N * M) 복잡도를가집니다. 다른 답에 요약 된 해법은 복잡도 O (N + M)을 갖는다. –
하나의 일반적인 방법은 하나 개의 파일에서의 각 행에 대한 해시 코드를 계산하는 것이다 (바람직하게는 하나의 작은). 그런 다음 전체 파일을 해시 테이블에 저장합니다. 이것은 작은 파일의 색인이됩니다.
그런 다음 큰 파일을 탐색하십시오. 각 행에 대해 해시를 계산합니다. 그런 다음 색인을 살펴보십시오. 거기에 그러한 해시 코드가 없다면,이 행은 차이점입니다. 그렇지 않은 경우 해시 코드가있는 경우 (여러 행에 동일한 해시가있을 수 있음) 해시 테이블의 모든 충돌 행과 원본 행의 전체 비교를 수행하고 중복이 있는지 확인합니다.
이제 복제본이 없으면 소스 파일의 행이 다시 고유하여 출력으로 푸시됩니다.
중복이있는 경우 해시 테이블에서 복제본을 제거하고 입력 행을 건너 뛰고 싶을 수 있습니다. 즉, 두 파일의 두 행이 동일하게 감지되어 서로 취소됩니다.
큰 파일을 보았을 때 해시 테이블의 나머지 행을 어떻게 처리할지 결정해야합니다. 다른 파일에 존재하지 않는 행이기 때문에 모든 파일을 출력으로 보내기를 원할 수도 있습니다. 이제
나는 의사를 개설하려고합니다 :
dict = new dictionary<code, list<row>>
-- Indexing phase
foreach row in file1
code = hash(row)
if dict.contains(code) then
dict[hash].add(row)
else
dict[hash] = new list(row)
-- Comparison phase
foreach row in file2
code = hash(row)
bool unique = true
if dict.contains(code) then
foreach indexedRow in dict[code]
if indexedRow is the same as row then
begin
unique = false
remove indexedRow from dict[code]
end
if unique then
push row to output
-- Finalization phase
foreach row in dict
push row to output
이 솔루션의
최고의 품질의 실행 시간 복잡도는 M과 N 행의 수는 O (M + N)는, 때문이다 각 파일. 단점은 인덱스에 O (min (M, N)) 메모리가 필요하다는 것입니다.
- 1. 파이썬은 두 개의 CSV 파일을 비교하고 CSV 파일에 데이터를 추가
- 2. 두 개의 파일을 비교하고 대체
- 3. 유닉스 나는 두 개의 파일을 두 개의 파일을 비교하고 라인
- 4. 두 개의 csv 파일을 비교하고 csv의 색상 코드를 색 지정하십시오.
- 5. 큰 csv 파일을 사용하는 방법
- 6. PERL 스크립트 3 CSV 파일을 비교하고 새 CSV 파일을 만들려면
- 7. 두 개의 큰 정렬 된 CSV 파일을 단일 파일로 결합
- 8. 큰 csv 파일을 R
- 9. 두 파일을 비교하고 목록을 만듭니다.
- 10. 2 개의 csv 파일을 비교하고 업데이트 된 값을 바꿉니다.
- 11. 두 파일을 비교하고 다른 파일에 보고서를 저장하십시오.
- 12. 이 개 CSV 파일을 비교하고 새로운 CSV 파일
- 13. 두 개의 csv 파일을 사용하여 Android에서 두 개의보기를 채우는 방법
- 14. 큰 csv 파일을 데이터베이스에 삽입
- 15. 두 개의 CSV 파일을 파이썬에서 병합합니다.
- 16. 두 개의 CSV 파일을 병합하는 Python
- 17. 키 값으로 두 개의 CSV 파일을 결합하십시오.
- 18. 여러 열을 기반으로 두 CSV 파일을 비교하고 별도의 파일로 저장
- 19. 비슷한 파일을 비교하고 모두
- 20. 키 필드를 기준으로 두 개의 CSV 파일을 비교 : 나는 같은 필드, 두 개의 CSV 파일이 파이썬
- 21. PHP로 두 개의 큰 CSV 파일 병합
- 22. 몇 개의 CSV 파일을 바인딩
- 23. 두 개의 Excel 파일을 비교하고 키 열을 기준으로 차이를 부여하십시오.
- 24. 두 CSV 파일을 PowerShell과 병합하는 방법
- 25. 두 개의 CSV 파일 내용을 비교하고 변수에 비슷한 내용을 저장하십시오.
- 26. 두 파일을 비교하고 어떤 행이 다른지 확인하십시오.
- 27. 누구나 C#에서 두 개의 CSV 파일을 비교합니까?
- 28. 여러 개의 csv 파일을 R
- 29. csv 파일을 두 개의 열로 줄이는 가장 빠른 방법
- 30. 두 개의 단일 열 csv 파일을 리눅스 명령으로 병합하는 방법
시도한 내용은 무엇입니까? – Imad
와우, 너무 넓습니다.하지만 괜찮은 성능을 원한다면, 중복 된 것을 검색하기 위해 메모리에있는 전체 2 개의 파일을 읽을 필요가 있다고 생각합니다. 행의 필드 순서가 동일하면 2를 사용할 수 있습니다. List –
Pikoh