【Matlab】 讀取檔案各種方法
阿新 • • 發佈:2019-01-26
解答:對於這個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'); 便可
四. 注意事項: