2014-01-22 4 views
1

"[dhvct] = textread (fn, '% s % * s % s % s % f % s % s')를 사용하는 Matlab의 이전 스크립트를 되 살리고 있습니다. ; " 데이터를 가져 오려면 textread를 textscan으로 바꾸고 싶습니다.Matlab은 textscan을 사용하여 더 적은 열로 행을 건너 뛰고 싶습니다.

내 문제는 (이전 및 새로운 두 가지 모두) 데이터의 네 번째 열 (부동 소수점 값)에 약간의 틈이 있다는 것입니다. 공백은 나의 구분자이므로 matlab은 글자가 부동 소수점 값으로 들어있는 다섯 번째 열을 삽입하려고하므로 오류가 발생합니다.

값없이 행을 자동으로 건너 뛰는 방법에 대한 제안 사항이 있으십니까? 내가 정기적으로 업데이 트해야하므로 수동 방법은 너무 많은 시간이 소요됩니다 약 100 파일이 있습니다.
1992년 1월 1일 @ 0시 0분 0초 Q25 T2
02/01

31/12/1991 @ 0시 0분 0초 Q25의 T2 : 내 데이터는 다음과 같이하지만, 오랜 기간 동안 보인다/1992 0시 0분 0초 24.451330 Q25 @ T2
1992년 3월 1일 0시 0분 0초 24.674587 Q25 @ T2
1992년 4월 1일 0시 0분 0초 25.264880 Q25 @ T2

감사

+1

Q25 및 T2와 같은 숫자 뒤에 모든 값이 필요합니까? 데이터에 콘텐츠 값이 있습니까? 예 : Q25 항상 Q25입니까? 아니면 항상 Q로 시작합니까? 이러한 경우에 대해 '텍스트 스캔'을 조정하기 위해 데이터에 대해 조금 알고 있어야합니다. – horchler

+0

안녕하세요, 모든 열이 필요하고 숫자가 바뀌지 만 Q와 T는 항상이 열의 첫 글자/숫자입니다 – user2738526

답변

1

그래, 이건 약간 해킹이지만 작동하지. textscan은 다른 방법보다 훨씬 빠르기 때문에 데이터에 특정 제약 조건이있는 경우 약간만 놀아 볼 가치가 있습니다.

fid = fopen('test.txt'); 
t = textscan(fid,'%s%*s%s%f%s%s','TreatAsEmpty','Q'); 
fclose(fid); 
t{:} 

당신은 t{3}은 빈 값의 기본 NaN와 5로-1 어레이는 것을 볼 수 있습니다. 그러나 t{4}에 첫 번째 두 요소에 대해 'Q' 행이 없기 때문에 더 많은 작업을 수행해야합니다. 이 이러한 목표를 달성하는 방법은 여러 가지가있을 수 있지만 여기에 'Q' 요구 사항이 추가 될 행에 인덱스 isnan를 사용하는 쉬운 라이너는 다음과 같습니다 어떻게 'TreatAsEmpty' 매개 변수 작업을 사용하여 않습니다

t{4}(isnan(t{3})) = cellfun(@(c)['Q' c],t{4}(isnan(t{3})),'UniformOutput',false); 


?

네 번째 열 (세 번째 건너 뛴 열)의 경우 숫자 필드를 처리합니다. 이 옵션은 숫자 필드 ('%f')를 감지 할 때만 적용됩니다. 'Q25' 문자열은 NaN 문자열과 '25' 문자열로 구분되어 효과적으로 열을 추가합니다. 다섯 번째 열에있는 'Q25' 요소는 문자열로 스캔되기 때문에 중요하지 않습니다. 따라서 문자 'Q'이 데이터의 다른 곳에 나타나는 경우에는 문제가 없습니다.

+0

감사합니다. – user2738526

관련 문제