[델파이/Delphi] Directory 내용 불러오기, File 내용 추출하기 예제
업무상 3,200개 정도 되는 .txt 파일에서 특정 문자열이 있는 라인을 전부 뽑아내야 하는 상황이 생겼다.
그래서 델파이로 지정한 경로의 파일 리스트를 불러오고, 파일들의 내용을 추출해내는 간단한 예제 코드를 만들어보았다.
(다행히도, 모든 파일이 정해진 양식대로 작성되어 있어서 쉽게 데이터를 추출해낼 수 있었다.)
TFileOpenDialog
* TOpenDialog의 상위 버전으로, Window Vista 이후 버전부터 사용할 수 있는 Dialog Component이다.
따라서 Windows XP를 지원해야 하는 경우에는 TOpenDialog를 사용해야 한다.
** Vista 이후의 버전에서 TOpenDialog와 TFileOpenDialog를 각각 실행시켜보면, 눈에 보이는 화면은 크게 다르지 않은것을 확인할 수 있는데, 이는 TOpenDailog가 Vista 이후의 버전에서는 자동으로 TFileOpenDialog를 실행시켜주기 때문이라고 한다.
What is the difference between the new TFileOpenDialog and the old TOpenDialog?
What is the difference between the new TFileOpenDialog and the old TOpenDialog? In my computer (Win 7/DXE), when I run the code, the dialogs look the same.
stackoverflow.com
- 사용법
- 선언 및 호출
if Win32MajorVersion >= 6 then //윈도우 버전 체크(Vista = 6)
begin
with TFileOpenDialog.Create(nil) do
begin
// do something..
finally
Free;
end;
end;
end;
- "Win32MajorVersion"으로 실행 환경의 윈도우 버전 정보를 가져올 수 있다.
- 위처럼 단발적으로 사용할 때는 코드 내에서 직접 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)
Dialog로 사용자가 선택한 폴더의 경로를 가져오는데에 성공을 했으니, 폴더 안에 들어있는 파일들을 가져와야 한다.
uses절에 System.IOUtils 를 추가하면 TDirectory 클래스를 사용할 수 있다.
function TDirectory.GetFiles() 에 폴더 경로를 인자로 넘겨주면 폴더에 들어있는 파일들을 String 배열 타입으로 리턴 받을 수 있다.
따라서 아래와 같이 사용이 가능하다.
var
sFile :String;
MemoFileList :TMemo; //dfm단에서 선언했지만, 이해를 위해 재차 적었습니다.
...
...
if Execute then //Dialog 실행.
begin
for sFile in TDirectory.GetFiles(FileName) do
begin
MemoFileList.Add(sFile);
end;
end;
- TDirectory.GetFiles(FileName) 을 통해 String 배열을 리턴받아, Memo에 표시해준다.
TStringList.LoadFromFile()
검사할 파일 리스트까지 불러오는데 성공했다면, 파일 내용을 가져오는건 굉장히 쉽다.
TStringList.LoadFromFile()에 인자로 파일의 전체 경로만 넘겨준다면 내용을 가져올 수 있다.
나의 경우는 파일에서 특정 패턴으로 작성되어 있는 문자열의 일부 내용을 추출해내고 싶었기에,
아래처럼 구현하여 문제를 해결했다.
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 타입을 함께 인자로 넘겨줘야 한글이 깨지지 않는다.
'Delphi' 카테고리의 다른 글
[Delphi/델파이] ADOConnection 사용 시 exe(실행파일) 실행안되는 경우. (0) | 2022.09.17 |
---|---|
[델파이/Delphi] 자료구조 - Queue (0) | 2022.01.19 |
[델파이/Delphi] 시간 측정 - TStopWatch (0) | 2021.12.14 |
[델파이/Delphi] TStringBuilder (0) | 2021.12.14 |
[델파이/Delphi] Generic(제네릭) 간단 사용 예제 (0) | 2021.11.27 |