Q&A

  • 문자열 비교 최적의 로직을....

A.TXT, B.TXT두개의 파일이 있습니다.
A.TXT는 100라인이 들어있고 B.TXT는 300라인이 있습니다.
A.TXT의 1줄의 문자열이 B.TXT의 각각 300라인을 돌며 해당 문자가 포함되어 있는지 확인하여 있으면
B.TXT에 A.TXT의 그 라인을 저장하는 것이 목적입니다.

예)

A.TXT파일의 1라인이 '3, 감,대추,호두,귤, 5' 이고
B.TXT파일의 1라인이 '파인애플, 사과, 감, 호두, 05' 일 경우
A.TXT의 맨 앞 2는 대조시 3개이상 일치해야 한다는 조건 수입니다.
위의 경우 감, 호두 두개의 문자가 B.TXT에 있으므로 3개가 마족하므로 B.TXT의 '파인애플, 사과, 감, 호두'
가 C.TXT에 저장되어야 하는 것이지요.
한가지 문제는 A.TXT마지막에는 숫자 5이고 B.TXT마지막에는 숫자 05입니다.
물론 두 수는 문자열이지만 5와 05가 아닌 05와 05처럼 비교되어져야합니다.

아래 예제입니다.

 AssignFile(f_Basefile, 'C:\A.TXT');   // 기준 파일
 AssignFile(f_TargetFile, 'C:\B.TXT');   // 대조 파일
 AssignFile(f_Save_File, 'C.txt');  // A.TXT의 문자열이 B.TXT문자열에 있으면 여기에 저장

 Reset(f_BaseFile);  // A.TXT파일 읽기
 Rewrite(f_Save_File);  // C.TXT파일 쓰기 준비

 while not Eof(f_Basefile) do  // A.TXT파일 푸프
   begin
     ReadLn(f_BaseFile, s_BaseLine);
     SL.CommaText := s_BaseLine;
     i_DataCnt1 := 0;  // 일치하는 갯수 체크변수 초기화
     Reset(f_TargetFile);  // B.TXT파일 읽기
     while not Eof(f_TargetFile) do
       begin
         ReadLn(f_TargetFile, s_TargetLine);
      // SL.CommaText[0]은 숫자 2니까 제외하고 SL.CommaText[1]~[4]에 들어있는 감,대추,호두,귤, 5을
      // 차례로 for문으로 돌며 b.txt파일의 300라인과 비교한다.
         for i := 1 to 5 do  // 감, 대추, 호두, 귤, 5
           begin
             if Pos((SL.Strings[i]), s_DataLine1) <> 0 then
                Inc(i_MatchCnt1);  // B.TXT에 들어있는 문자열이면 일치 수 1 추가
             end;
         if i_MatchCnt >= SL.Strings[0] then
           WriteLn(f_Save_File,  s_TargetLine);
           //모두 3개가 일치하므로 C.TXT파일에 B.TXT의 현재 라인을 추가 한것.
       end
    end;

대충 이런식인데요 실질적으로 a.txt의 라인과 b.txt의 라인안의 문자열 비교에 숫자 5와 05도 비교해야하면
5를 05로 변환하거나 05를 5로 변환하는등이 필요할거 같은데 이것이 어렵지는 않은데
막상 어떤 함수를 사용해도 위의 방법은 그다지 빠르지가 않는거 같습니다.
만약 b.txt파일의 라인수가 300라인이 아니라 30,000라인이라면 체감적으로 속도차이가 더 나겠지요.
비교할 수 있는 더 빠른 최적의 방법이 없는지 궁금합니다.
도움 부탁드립니다.
오늘부터 춥다는데 감기 조심하시구요~~

0  COMMENTS