업무상 3,200개 정도 되는 .txt 파일에서 특정 문자열이 있는 라인을 전부 뽑아내야 하는 상황이 생겼다.
그래서 델파이로 지정한 경로의 파일 리스트를 불러오고, 파일들의 내용을 추출 해내는 간단한 예제 코드를 만들어보았다.
(다행히도, 모든 파일이 정해진 양식대로 작성되어 있어서 쉽게 데이터를 추출해낼 수 있었다.)
TOpenDialog
의 상위 버전으로, Windows Vista 이후 버전부터 사용할 수 있는 Dialog Component 이다. 따라서 Windows XP를 지원해야 하는 경우에는 TOpenDialog
를 사용해야 한다.TOpenDialog
와 TFileOpenDialog
를 각각 실행시켜보면, 눈에 보이는 화면은 크게 다르지 않은것을 확인할 수 있는데, 이는 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
속성 값을 설정해주면, 다음과 같이 약간의 커스텀을 할 수 있다....
...
if Execute then //Dialog 실행.
begin
showmessage(FileName);
end;
...
...
Execute
를 실행하면 Dialog 화면이 호출된다. OK / Cancel 여부를 boolean으로 리턴 해준다.FileName
속성값에 사용자가 선택한 폴더의 전체 경로 가 들어있다.검사할 파일 리스트까지 불러오는데 성공했다면, 파일 내용을 가져오는건 굉장히 쉽다.
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 타입을 함께 인자로 넘겨줘야 한글이 깨지지 않는다.