1. 程式人生 > >【Matlab】 讀取檔案各種方法

【Matlab】 讀取檔案各種方法


解答:對於這個txt檔案,由於各行列數相同,故簡單地使用load,importdata均可。


2.欄位名(中、英文欄位均可)+資料:
原始檔:


CODE:
CH0 CH1 CH2 CH3
0.000123 0.000325 0.000378 0.000598
0.000986 0.000256 0.000245 0.000698


解答:由於是記錄的形式,因此各行列數必相同(缺少部分列時請自行在檔案中補上 Inf 或 NaN),故直接使用 importdata 便可。

3.註釋(含有獨立的數字串)+資料(列數相同):
問題:這個檔案有4列,但前6行是文字說明,4列數字是從第8行開始的.現在我想把這個檔案的前2列和文字說明提出來組成一個新的dat檔案

原始檔:


CODE:
Group 2  12.02.2006   Limei
Samples of datas: 50000

CH0  CH1  CH2  CH3
0.000123  0.000325   0.000378   0.000598
0.000986  0.000256   0.000245   0.000698


目標檔案:


CODE:
Group 2 12.02.2006 Limei
Samples of datas: 50000

CH0 CH1
0.000123 0.000325
0.000986 0.000256


解答:由於註釋中含有獨立的數字串,且註釋部分沒有明顯的格式, 這時候用importdata, load等高階命令直接讀取會失敗,用 textread, dlmwrite 等格式化命令也不太合適,因此只能使用低階命令進行讀取。(當然了,可以跳過註釋部分直接用高階命令讀取資料,即:[a b c d] = textread(filename,'%f %f %f %f','headerlines',4); )。一個簡單的、非通用的包含註釋的讀取方法如下:
-------------------------------------轉 ---------------------------------------------------------------------------------------

CODE:
clc;clear;
fid = fopen('exp.txt', 'r');
fid_n=fopen('ex.dat','w');
while ~feof(fid)
    tline=fgetl(fid);
    if ~isempty(tline)
        if double(tline(1))>=48 && double(tline(1))<=57  %數值開始
            a=strread(tline);
            a(3:4)=[];
            fprintf(fid_n,'%f %f\n',a);
            clear a;
        elseif double(tline(1))==67   %字母C開始
           [b1,b2,b3,b4]=strread(tline,'%s %s %s %s');
           b=[b1{1},'  ',b2{1}];
            fprintf(fid_n,'%s\n',b);
            clear b b1 b2 b3 b4;
        else
            fprintf(fid_n,'%s\n',tline);
        end
    else
        fprintf(fid_n,'%s\n',tline);
    end
end
fclose(fid);
fclose(fid_n);


---------------------------------------------------------------------------------

4. 註釋(不含獨立的數字串)+資料(列數相同):

原始檔:

CODE:
你好 abc
歡迎來到 我們
振動論壇
vib.hit.edu.cn
1 11 111 1111
2 22 222 2222
3 33 333 3333
4 44 444 4444
5 55 555 5555


解答:直接用 importdata 便可

注:有時候註釋中含有獨立的數字串也可以 importdata 成功,不過得到的結果有可能不正確,建議這時候使用第3種情形的讀取方式。

5. 註釋與資料混排:
對此當然只能自己程式設計,舉例:

原始檔

CODE:
1 11 111 1111
你好
2 22 222 2222
歡迎來到
3 33 333 3333
振動論壇
4 44 444 4444
vib.hit.edu.cn
5 55 555 5555


解答:

--------------------------------------------轉--------------------------------------


CODE:

function [data]=distilldata(infile)
%功能說明:
%將儲存資料的原始檔案中的數值資料讀入到一個data變數中
%使用說明:
% infile——原始資料檔名;
% data=資料變數

tmpfile='tmp2.mat';

fidin=fopen(infile,'r'); % 開啟原始資料檔案(.list)

fidtmp=fopen(tmpfile,'w'); % 建立儲存資料檔案(不含說明文字)

while ~feof(fidin) % 判斷是否為檔案末尾
  tline=fgetl(fidin); % 從檔案讀入一行文字(不含回車鍵)
  if ~isempty(tline) % 判斷是否空行
    [m,n]=size(tline);
    flag=1;
    for i=1:n %判斷一行中有沒有字元(+-.Ee和空格鍵除外)
      if ~(tline(i)==' '|tline(i)=='-'|tline(i)=='.'|tline(i)=='E'...
          |tline(i)=='e'|tline(i)=='+'...
          |(double(tline(i))>=48&&double(tline(i))<=57))
        flag=0;
        break;
      end
    end
    if flag==1 % 如果是數字行,把此行資料寫入檔案
      fprintf(fidtmp,'%s\n',tline);
    end
  end
end

fclose(fidin);

fclose(fidtmp);

data=textread(tmpfile);

delete(tmpfile);



---------------------------------------------------------------------------------------------------------
另外,如果要求不高,也可以使用 textread 函式跳過註釋部分進行讀取,不過前提是需要事先知道檔案內容的結構(即哪行是資料、哪行是註釋)

6.各列資料的分離:
原始檔:


CODE:
           0 +  47038.7   1.05  09:26:07  C
           2 +  46477.7   1.03  09:28:38  C  
           4 +  44865.7   1.04  09:28:48  C  
           6 +  41786.4   1.03  09:28:56  C  
           8 +  39896.0   0.97  09:29:03  C  
          10 +  37518.4   0.93  09:29:15  C  
          12 +  35858.5   0.92  09:29:30  C  
          14 +  46105.0   1.03  09:30:21  C  
          16 +  46168.6   6.89  09:30:30  C  
          18 +  48672.3   4.33  09:30:40  C  
          20 +  49565.7   0.49  09:30:48  C  
          22 +  49580.7   0.53  09:30:55  C  
          24 +  49602.3   0.84  09:31:03  C  
          26 +  49582.5   1.51  09:31:11  C  
          28 +  49577.0   1.39  09:31:19  C  
          30 +  49589.3   0.61  09:31:27  C  
          32 +  49578.3   1.06  09:31:29  C  
          34 +  49512.5   1.77  09:31:38  C




解答:直接用 [a,b,c,d,e,f]=textread(yourfilename,'%d %c %f %f %s %c'); 便可


四. 注意事項: