2014-12-03 169 views
0

我正在嘗試將一種結構化文本文件讀入MatLab。它看起來像這樣:Matlab閱讀文本問題

Header 

Result Damage "Load Analysis"  0.002000000 Vector OnNodes 
ComponentNames "DN", "DT" 
Values 
    1 0.00000000E+00 0.00000000E+00 
    2 0.00000000E+00 0.00000000E+00 
    3 0.00000000E+00 0.00000000E+00 
    4 0.00000000E+00 0.00000000E+00 
End Values 

Result Damage "Load Analysis"  0.004000000 Vector OnNodes 
ComponentNames "DN", "DT" 
Values 
    1 0.00000000E+00 0.00000000E+00 
    2 0.00000000E+00 0.00000000E+00 
    3 0.00000000E+00 0.00000000E+00 
    4 0.00000000E+00 0.00000000E+00 
End Values 

而且這些值在塊中重複。我只需要讀取文件中每個塊的重複塊內的行中的3個值。我想過這樣的代碼:

fid=fopen('FileName.res'); 
while ~feof(fid) 
    tline = fgetl(fid); 
    if ischar(strtrim(tline)) == 1 
     continue 
    else 
    %command to put the values within a matrix of kind A[inf,3] 
    end 
end 

的第一個問題是,當它涉及到的是實際上的數字命令ischar返回的價值線。這樣我仍然無法進入將數字放入矩陣的第二部分。關於這些問題的任何想法?

+0

'fgetl'的輸出始終是一個字符數組,除非該行只包含換行符。一個建議是調整你的邏輯,而不是尋找'價值',並閱讀,直到你看到'結束價值' – excaza 2014-12-03 14:45:44

回答

1

如果你的文件有一個一致的格式,我會看看textscan,因爲它非常靈活,適用於像你這樣的塊的文件。否則,對於儘可能接近原始代碼的解決方案,只要嘗試將每行讀作一個數字,如果它成功了,那麼將該數字添加到您的表中,如果失敗,請繼續閱讀下一行。

fid=fopen('FileName.res'); 
fullTable = [] ; 
while ~feof(fid) 
    tline = fgetl(fid); 
    tempRow = sscanf(tline , '%d%f%f').' ; %' // try to read the string as numbers 
    if ~isempty(tempRow) 
     fullTable = [ fullTable ; tempRow ] ; % // append numbers to the master table 
    end 
end 
fclose(fid) 
0

問題是fgetl只是將整行讀入爲一個字符串。即ischar('1 2 3')返回true。它可能包含數字,但變量類型本身是一個字符串。所以你需要看看不是由fgetl返回的類型,而是內容。

未經測試,但我認爲這會工作:

fid=fopen('FileName.res'); 
while ~feof(fid) 
    tline = fgetl(fid); 
    if strcmp(tline,'Values') 
     tline = fgetl(fid); % this should read the line starting 1 
     while strncmp(tline,'End',3) %only match first three letters 
     % put values in matrix 
     tline = fgetl(fid); % get next line 
     end 
    end 
end 

這是什麼應該做的:

1)讀取行,直到它找到一個寫着「價值」(你可能有strcmp玩/ strncmp如果該空白也被讀入)。
2)讀取下一行
3)將值矩陣
4)讀取下一行
5)如果下一行不啓動「結束」,返回到3。
6)如果下一行開始'結束',回到1.