2012-11-02 267 views
0

我試圖從.cnv文件中讀取一些數據。我可以打開文件:從.cnv文件導入數據到matlab

TopFolder = 'Name_of_my_file'; 
SubFolder = dir(fullfile(TopFolder,'*.cnv')); 
fid = fopen(fullfile(TopFolder,SubFolder{i})); 

所有的數據位於下面的字符串結束,這是一個單獨的行到另一頭。我想導入存儲在該字符串後面的行中的數據。這怎麼能實現?

例如,.cnv文件的一個部分如下:

# datcnv_in = D:\data\110606_000.hex D:\instrument software\Seabird 2010-07\Seabird Con Files\SBE19_2108_ScufaTOBS.con 
# datcnv_skipover = 0 
# file_type = ascii 
*END* 
    -0.051  0.0312 15.4328 138.1551  0.0000  0.0000  0.0000  0.0000 0.000e+00 
    -0.033  0.0305 15.4277 138.1551  0.0000  0.0000  0.0000  0.0000 0.000e+00 

所以,我想避免那些行之前結束

也許一個第一步驟是找到END的行號?我將如何做到這一點?

回答

1

首先打開該文件,並通過行搜索,直到找到 'END'

fid = fopen('yourfile.cnv')  % open file to read 
fseek(fid,0,-1);    % set read position to beginning of file 
while strcmp(fgetl(fid),'*END*') == 0 end  % go through lines until '*END*' 

下讀取數據,一行行,成矩陣(data):

n=1;        
while 1 
    tline = fgetl(fid)     % read in line 
    if ~ischar(tline), break, end  % if eof, break and finish 
    data(:,n) = sscanf(tline,'%f')  % put numbers in a matrix (in columns) 
    n=n+1 
end 

fclose(fid) % close file 
+0

您能否解釋一下腳本的第一部分是如何工作的。雖然這完美的作品,我不明白如何!如果Linechk在內部等於0,while循環後它怎麼能等於1? – KatyB

+0

另外,'Linechk'有什麼用?它在代碼的其餘部分中沒有使用? – KatyB

+0

Linechk變量不一定是必需的。我認爲它使跟蹤代碼更容易。如果找到'* END *'序列,它本質上是一個== 1的標誌。我已經更新了答案以刪除變量。 – atomh33ls

0

在matlab中使用導入嚮導時,您可以指定標題行的數量。 如果將其設置爲4,則應該在此示例中起作用。

使用導入嚮導後,如果您希望自動執行未來的過程,可以讓它生成代碼。

+0

如果能夠做到這一點將是一件好事,而不必指定標題行的數量,即可以通過指定數據從字符串END後面的行開始來實現。 – KatyB

+0

我想會有一種更精緻的方式,但一個解決方案可能是: 以文本形式導入整個文件,找到頂部的END,將文件的其餘部分轉換爲數字。 –

0

試試這個:

L = ''; 
while isempty(findstr(L,'*END*')) % if the line doesn't contain *END* => read a new line 
    L = fgetl(fid);    % read next line of file 
end 
a = fscanf(fid,'%g %g %g %g');  % add as many %g as columns in your data 
fclose(fid); 

我已經添加了這是如何工作的一些意見。基本上,它會逐行讀取打開的文件,直到找到包含*END*的行。


如果超過1行可能包含相同字符,則可以使用strcmp(L,'*END*')


警告:此代碼假定您正在閱讀的文件至少包含一行,其中包含*END*個字符,如果不是,則嘗試超出EOF時讀取時會出錯。

希望這會有所幫助。