[C#] 파일에서 중복을 제거하는 방법

http://chaoskcuf.com/entry/C-파일명이-중복일-때-자동으로-이름을-생성하는-코드#comment3151

김시억님께서 위의 주소에 문의하신 내용입니다.

중복제거에관한건데요 텍스트화일을 불러들여 중복제거를 하려고합니다
처음인데 막상시작하려하니 희안하게 로직이 잘 안떠오르는군요///
제가 1년좀 안되는데요 c#만 ....한번도 안해봐서 텍스트중복은;;;
aa
aa
bb
bb
이렇게 있다고 할경우 저 텍스트화일을 중복제거해서
aa
bb
이렇게만 결과물이 나오게하려면 어떻게 해야하나요?
쉬운거 같으면서도 막상코딩하려니 로직이 감이 잘 안잡히네요 ㅠ.ㅠ
답변부탁드립니다


가장 쉬운 방법은 .NET Framework 3.5에 HashSet을 사용하는 것입니다.
HashSet은 .NET Framework 3.5에 처음 추가된 Generic Class로 어셈블리는 System.Core.dll이고,
Namespace는 System.Collections.Generic 입니다.
(주의 .NET Framework 3.5가 설치되어 있지 않으면 당연히 위의 클래스를 사용할 수 없습니다.)

Hash 특성상 내부의 hash function으로 현재 collection 안에 들어있는 값을 찾는데 걸리는 시간이 적고,
Set 특성상 같은 내용을 중복으로 담고 있지 않아서 문의하신 내용에 가장 적합한 클래스입니다.

(그러나 Add 메소드는 상대적으로 다른 Collection보다 느릴 수 있기 때문에, 아주 긴 파일(수 MB가 넘는 파일)에는 적합하지
않을 수 도 있습니다.)

해당 내용은 아래와 같이 구현할 수 있습니다.


Program.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.IO;

namespace HashSetTest
{
    class Program
    {
        static void Main(string[] args)
        {
            HashSet<string> set = new HashSet<string>();

            using (TextReader reader = File.OpenText("test.txt"))
            {
                string line = reader.ReadLine();
                while (string.IsNullOrEmpty(line) == false)
                {
                    set.Add(line);
                    line = reader.ReadLine();
                }
            }

            foreach (string setItem in set)
            {
                Console.WriteLine(setItem);
            }
        }
    }
}

test.txt

aa
bb
aa
cc
aa
bb

Output

output


샘플 프로젝트 파일도 함께 첨부합니다.



참고로 파일이 아주 길 경우에는
메모리 문제와 속도 문제 때문에 Merge Sort하는 방식으로 부분 부분 정렬해서
중복을 제거할 수도 있겠습니다.

chaoskcuf
프로그래밍/TIP& Study 2009/03/13 23:12

트랙백 주소 : http://chaoskcuf.com/trackback/191

댓글을 달아 주세요

Powerd by Textcube, designed by criuce
rss