티스토리 뷰

matlab

특정 문구가 들어있는 txt 파일 찾기

게으른 the lazy 2024. 6. 27. 16:13

 

답부터 보여주기

d = dir('./**');
d = d(~ismember({d.name}, {'.', '..'}));
d = d([d.isdir] == 0 & endsWith({d.name}, '.txt'));

for i = 1:length(d)
    ifile = fullfile(d(i).folder, d(i).name);
    fid = fopen(ifile);
    s = fscanf(fid, '%c');
    fclose(fid);
    if contains(s, 'pattern')
        keyboard
    end
end

 


 

나는 메모할 것이 있으면 일단 텍스트 파일에 적어둔다. 그리고 정기적으로 텍스트 파일들을 정리한다. 지울 것은 지우고, 합칠 것은 합치고, 당장 안 볼 것 같은 파일은 저장하고 닫는다. Notepad++가 참 좋은 앱이다. 그런데 문제가 있다. 메모를 너무 많이 한다. 그리고 어디에 무엇을 적어뒀는지 까먹는다.

 

인상깊게 봤던 영상이 하나 있었다. 영상을 보면서 무언가 적어둔 것이 있는데, 어느 파일에 적어뒀는지 기억이 나지 않았다. 분명 영상 링크를 같이 적어두었을 것이므로, 영상 id인 "OfW4huYVNQc"가 들어있는 텍스트 파일을 찾으면 된다. 그런데 파일이 어느 폴더에 들어있는지도 모르겠다면?

 

1. 텍스트 파일이 있을 법한 폴더 하위의 모든 파일을 찾는다.

2. 그 중 확장자가 txt인 것만 걸러낸다.

3. fscanf로 열어서 찾고자 하는 문구가 있는지 확인한다.

 


 

현재 폴더 아래의 모든 하위 폴더 검색하기 글을 쓴 적이 있다.

 

d = dir('./**');
d = d(~ismember({d.name}, {'.', '..'}));
d = d([d.isdir]);

 

지금은 파일을 찾는 것이므로 마지막 줄은 아래처럼 바뀌어야 한다. 이 작업들은 Variables 창을 띄워놓고 하면 결과를 바로바로 볼 수 있어서 편하다.

 

d = dir('./**');
d = d(~ismember({d.name}, {'.', '..'}));
d = d([d.isdir] == 0);

 

이제 확장자가 txt인 것을 찾으면 된다. endsWith 함수는 문자열이 특정 패턴으로 끝나는지를 확인한다.

 

>> endsWith('D:\downloads\qna.txt', '.txt')
ans =
  logical
   1
>>

 

그런데 endsWith의 첫 번째 인자로 파일명이 들어가야 하는데, 파일명이 구조체의 필드로 들어가 있어서 문제가 된다. 방법이 있다. 구조체 배열 전체의 특정 필드를 반환 받으면서 { }로 감싸면 해당 필드가 모두 들어간 셀 배열이 반환된다.

 

>> d.name
ans =
    '4peg_hanoi.gif'
ans =
    'IMG_4662.PNG'
ans =
    'Python basics.pdf'
ans =
    'udemy.txt'
ans =
    'visualizing_imaginary_unit.m'
ans =
    '잡노트.txt'
ans =
    '회로그리기.gif'
>> {d.name}
ans =
  1×7 cell array
  Columns 1 through 2
    {'4peg_hanoi.gif'}    {'IMG_4662.PNG'}
  Columns 3 through 4
    {'Python basics.pdf'}    {'udemy.txt'}
  Columns 5 through 6
    {'visualizing_imaginary_unit.m'}    {'잡노트.txt'}
  Column 7
    {'회로그리기.gif'}
>>


이제 endsWith는 셀 배열의 각 원소가 특정 패턴으로 끝나는지를 logical 1 또는 0으로 알려준다.

 

>> endsWith({d.name}, '.txt')
ans =
  1×7 logical array
   0   0   0   1   0   1   0
>>

 

폴더가 아닌 것을 확인하는 부분과 합치면 아래와 같다.

 

d = dir('./**');
d = d(~ismember({d.name}, {'.', '..'}));
d = d([d.isdir] == 0 & endsWith({d.name}, '.txt'));

 

이제 fscanf로 파일을 열어서 내가 찾는 문자열이 있는지 확인하면 된다.

 

for i = 1:length(d)
    ifile = fullfile(d(i).folder, d(i).name);
    fid = fopen(ifile);
    s = fscanf(fid, '%c');
    fclose(fid);
    if contains(s, 'OfW4huYVNQc')
        keyboard
    end
end

 

 

내가 찾던 그 영상에 대한 코멘트는 '교육철학 시리즈.txt'라는 파일에 들어있었다. 왜...

 

댓글