[Delphi] Directory 내용 불러오기, File 내용 추출하기 예제

Clover·2022년 4월 11일
0

Delphi

목록 보기
12/12
post-thumbnail

업무상 3,200개 정도 되는 .txt 파일에서 특정 문자열이 있는 라인을 전부 뽑아내야 하는 상황이 생겼다.
그래서 델파이로 지정한 경로의 파일 리스트를 불러오고, 파일들의 내용을 추출 해내는 간단한 예제 코드를 만들어보았다.

(다행히도, 모든 파일이 정해진 양식대로 작성되어 있어서 쉽게 데이터를 추출해낼 수 있었다.)


TFileDialog

  • TOpenDialog의 상위 버전으로, Windows Vista 이후 버전부터 사용할 수 있는 Dialog Component 이다. 따라서 Windows XP를 지원해야 하는 경우에는 TOpenDialog를 사용해야 한다.
  • Vista 이후 버전에서 TOpenDialogTFileOpenDialog를 각각 실행시켜보면, 눈에 보이는 화면은 크게 다르지 않은것을 확인할 수 있는데, 이는 TOpenDialog가 Vista 이후의 버전에서는 자동으로 TFileOpenDialog를 실행시켜주기 때문 이라고 한다.

출처 : Stack Overflow

사용법

선언 및 호출

if Win32MajorVersion >= 6 then  //윈도우 버전 체크(Vista = 6)
begin
  with TFileOpenDialog.Create(nil) do
  begin
    // do something..
    finally
      Free;
    end;
  end;
end;
  • Win32MajorVersion 으로 실행 환경의 윈도우 버전 정보를 가져올 수 있다.
  • 위처럼 TFIleOpenDialog를 코드 내에서 직접 Create해서 사용할 수도 있고, Tool palette에서 검색해서 사용할 수도 있다.

설정

...
  //폴더(Directory) 선택기능을 위한 옵션 설정.
  Options := [fdoPickFolders, fdoPathMustExist, fdoForceFileSystem];
  Title := '폴더 선택';  //Dialog창의 Caption.
  OkButtonLabel := 'Go';  //Dialog창의 "선택" 버튼의 Caption.
...
  • "파일"이 아닌 "폴더" 를 선택하는 기능이 필요했으므로, Options 속성값을 위와 같이 설정해준다.
  • Title 속성과 OkButtonLabel 속성 값을 설정해주면, 다음과 같이 약간의 커스텀을 할 수 있다.

Dialog 실행 및 Data 가져오기

...
...   
  if Execute then  //Dialog 실행.
  begin
    showmessage(FileName);
  end;
...
...
  • Execute를 실행하면 Dialog 화면이 호출된다. OK / Cancel 여부를 boolean으로 리턴 해준다.
  • FileName 속성값에 사용자가 선택한 폴더의 전체 경로 가 들어있다.

TDirectory.GetFiles(path)

검사할 파일 리스트까지 불러오는데 성공했다면, 파일 내용을 가져오는건 굉장히 쉽다.
TStringList.LoadFromFile() procedure에 전달 인자로 파일의 전체 경로만 넘겨준다면 내용을 가져올 수 있다.

나의 경우는 파일에서 특정 규칙으로 작성되어 있는 문자열의 일부 내용을 추출해내고 싶었기에, 아래처럼 구현하여 문제를 해결했다.

procedure parseContent(FileName :String);
var
  sList :TStringList;
  Content, TargetStr, temp :String;
begin
  sList := TStringList.Create;
  //파싱할 문자열 패턴 = '2022-01-02  상태 : isOk \n'
  //추출할 데이터 : isOk
  TargetStr := '상태 :';
  try
    sList.LoadFromFile(FileName, TEncoding.UTF8);  //파일의 내용 가져오기
    for Content in sList do
    begin
      if pos(TargetStr, Content) > 0 then  //문자열을 찾았다면 true
      begin
        temp := Trim(Content);
        temp := copy(temp, pos(':', temp) + 2, pos('\n', temp) - pos(':', temp) - 2);
        MemoContent.Lines.add(temp);
      end;
    end;
  finally
    sList.Free;
  end;
end;
  • LoadFromFile()을 할 파일의 Encoding 타입을 함께 인자로 넘겨줘야 한글이 깨지지 않는다.

0개의 댓글