2010-04-06 2 views
3

비슷한 질문이 있습니다. 하지만 지금은 뭘 시도하고 있습니다 .txt 형식의 파일을 MATLAB으로 읽는 것입니다. 내 문제는 헤더입니다. 오류로 인해 시스템은 파일 중간에서 헤더를 다시 작성한 다음 MATLAB이 파일을 읽을 수 없습니다. 그것을 건너 뛸 수있는 방법이 있습니까? 나는 캐릭터가 무엇인지 안다면 나는 몇몇 캐릭터를 읽지 않아도된다는 것을 알고있다.MATLAB에서 헤더 읽기 건너 뛰기

여기에 제가 사용하는 코드가 있습니다.

[c,pathc]=uigetfile({'*.txt'},'Select the data','V:\data');  
file=[pathc c];  
data= dlmread(file, ',', 1,4);  

이렇게하면 사용자가 파일을 선택할 수 있습니다. 내 파일은 대개 [86400 125] 크기가 커서 자연스럽게 125 개의 헤더 필드 이상을 파일에 의존합니다.

감사

파일이 내가 복사 할 수 있도록 큰 있기 때문에

있지만

같은 형식
day  time col1 col2 col3 col4 ............................... 
    2/3/2010 0:10 3.4 4.5 5.6 4.4 ............................... 
..................................................................  
.................................................................. 

DLMREAD

+0

당신은 파일의 예를 게재 할 수 있습니까? – yuk

답변

3

에 당신은 단지 숫자 데이터를 읽을 수있다. 첫 번째 두 열에는 날짜와 시간이 표시되지 않습니다.

data = dlmread(file, ' ', 1,2); 

하루도 가져 오려면 시간 당신은 DLMREAD 대신 IMPORTDATA를 사용할 수 있습니다 : 다른 데이터가 모두 숫자 인 경우에는 오른쪽에있는 첫 번째 행 2 열을 건너 DLMREAD 말할 수

A = importdata(file, ' ', 1); 
dt = datenum(A.textdata(2:end,1),'mm/dd/yyyy'); 
tm = datenum(A.textdata(2:end,2),'HH:MM'); 
data = A.data; 

날짜와 시간은 일련 번호로 변환됩니다. DATESTR 기능으로 다시 변환 할 수 있습니다.

+0

위의 문제에 대한, 난 그냥 내 파일을 읽을 수있는 방법을 찾고있다. 위의 코드에서 본 것처럼 헤더가 건너 뜁니다. 나는 그것이 중간에 헤더 행 행인을 만나는 경우 읽기를 멈추지 않는 matlab에 대한 방법이 있는지 궁금 해서요. 예를 들어 1000 행 정도의 헤더 (지금은 내가 실행하지 않는 한 어떤 행인지 알 수 없습니다) 감사합니다. – Paul

+0

이것이 제가 예제를 요구 한 이유입니다. Jonas의 답변에서 textscan을 사용하십시오. – yuk

2

textscan을 사용할 수 있음이 밝혀졌습니다. 당신은 모든 것을 문자열로 읽는 것을 제외하고. 그런 다음 double로 변환하려고 시도합니다. 'str2double'은 문자열에 대해 NaN을 반환하며 헤더는 모두 문자열이므로 머리글 행을 모든 NaN이있는 행으로 식별 할 수 있습니다. 예를 들어

는 :

%# find and open file 
[c,pathc]=uigetfile({'*.txt'},'Select the data','V:\data'); 
file=[pathc c]; 
fid = fopen(file); 

%# read all text 
strData = textscan(fid,'%s%s%s%s%s%s','Delimiter',','); 

%# close the file again 
fclose(fid); 

%# catenate, b/c textscan returns a column of cells for each column in the data 
strData = cat(2,strData{:}); 

%# convert cols 3:6 to double 
doubleData = str2double(strData(:,3:end)); 

%# find header rows. headerRows is a logical array 
headerRowsL = all(isnan(doubleData),2); 

%# since I guess you know what the headers are, you can just remove the header rows 
dateAndTimeCell = strData(~headerRowsL,1:2); 
dataArray = doubleData(~headerRowsL,:); 

%# and you're ready to start working with your data 
+1

str2double에 cellfun을 사용하지 마십시오. 그냥'doubleData = str2double (strData); '가 작동합니다. – yuk

+1

uigetfile 및 textscan 줄의 따옴표를 확인하십시오. – yuk

+0

죄송합니다. @yuk을 찾아 주셔서 감사합니다. 또한 cellfun없이 str2double이 작동한다는 것을 지적 해 주셔서 감사합니다. 나는 새로운 것을 배웠다. – Jonas