Matlab檔案IO--文字與數值的讀

兔美醬xz發表於2014-03-10

   最近專案模擬需要用到Matlab的GUI設計,與所有其他設計語言GUI設計一樣,最基礎也是最重要的就是有關資料的讀寫以及資料型別的轉換。所以今天就對Matlab檔案IO進行下學習,這篇重點是文字與數值讀的應用。

   1. 讀取純數值的文字檔案

    

%% 讀取純數值的文字檔案
format long g
dat1 = load('data1.txt');
dat2 = importdata('data1.txt')
[a,b,c,d] = textread('data1.txt','%2d %8.3f %8.3f %7.3f') %使用textread函式
                                                          %讀取該檔案到4個列向量中
fid = fopen('data1.txt');  %以只讀模式開啟該文字檔案,為fscanf和textscan函式
                            %的讀取操作做準備
dat3 = fscanf(fid,'%g',[4,inf]); %讀取4*inf個elements
frewind(fid);          %將文字指標移到檔案開頭
dat4 = textscan(fid,'%2d %8.3f %8.3f %7.3f'); %採用textscan函式讀取文字檔案的數值
                                                %到單元陣列中
dat4{:} %檢視該單元陣列
fclose(fid);
fid = fopen('data1.txt','rt');   %以文字模式開啟該檔案
dat5 = fread(fid);  %讀取該文字的所有字元,返回其ASCII值
                    %reads
                    %data from a binary file into column列 vector A and
                    %positions the file pointer at the end-of-file marker
str5 = char(dat5')   %將ASCII值轉化為字串
dat6 = str2num(str5)              %由字串獲取數值陣列
fclose(fid);

   2. 讀取包含文字和數值的文字檔案


%% 讀取包含文字和數值的文字檔案
dat1 = importdata('data2.txt',' ',1); %loads
                                       %data from ASCII file, filename, or the clipboard,
                                        %reading numeric data starting from line headerlinesIn+1
                                        %這裡指明文字是以空格來作為分隔的,如果是文字以逗號分隔
                                        %這裡就需要改為','
dat1.data        %dai1為一個結構體,返回其數值段
dat1.textdata    %返回dat1的文字資料段,即第一行和第一列。非數值項都儲存在該段內
[a, b, c, d] = textread('data2.txt','%s %f %f %f','headerlines',1) %採用textread函式
                                                                   %函式讀取該檔案,跳過第一行
fid = fopen('data2.txt');   %以制度模式開啟
dat2 = textscan(fid,'%s %f %f %f','HeaderLines',1)
dat2{:} %以列的形式展示
fclose(fid);

  3. 讀取包含文字和資料混合的文字檔案


%% 讀取包含文字和資料混合的文字檔案
dat1 = textread('data3.txt','%s','delimiter','\n')  %將\n換行視為分隔符
                                                     %When textread reads a consecutive series
                                                     %of whitespace values, it treats them as one white
                                                     %space. When it reads a consecutive series of delimiter values,
                                                     %it treats each as a separate delimiter.
n1 = str2num(dat1{3})              %提取第三行的數值,即為串列埠1的幀數,將字串單元轉換為數值型
dat1_1 = dat1(6:9)                 %提取串列埠1的資料到字串單元陣列dat1_1中
dat1_2 = cell2mat(deblank(dat1_1))    %將字串單元陣列轉換為字元陣列,
                                      %removes all trailing whitespace and 
                                      %null characters from the end of character string str
dat1_3 = str2num(dat1_2)           %將字元陣列轉換為數值陣列
para1 = dat1_3(:,2)                %提取串列埠1的引數2的值,即陣列陣列dat1_3的第二列
m = find(strcmp(dat1,'串列埠2幀數:'))  %找到內容為“串列埠2幀數:”的行
n2 = str2num(dat1{m+1})             %提取串列埠2的幀數
dat2_1 = dat1(m+4:m+4+n2)          %提取串列埠2的資料到字串單元陣列dat2_1中
dat2_2 = cell2mat(deblank(dat2_1))  %將字串單元陣列轉換為字元陣列
dat2_3 = str2num(dat2_2)            %將字元陣列轉換為數值陣列
%%%%%%%%%%%%%%%%%%%%%%以下程式段採用textscan函式讀取文字檔案並提取資料%%%%%%%%%%%%%%%%%%%%%%%%
fid = fopen('data3.txt');           %以只讀模式開啟
n1 = textscan(fid,'%d','HeaderLines',2)    %採用textscan讀取兩行之後的資料,即為串列埠1的幀數
dat1 = textscan(fid,'%[^串列埠]','HeaderLines',2)   %從當前位置跳兩行開始讀取字串
                                                 %直到遇到“串列埠”等字元
dat1_1 = str2num(dat1{:}{:})        %將上面讀到的字串轉化為數值陣列。注意,dat1_1為包含回車符的字串
fclose(fid);


3的結果輸出:

dat1 = 


    '串列埠資料以混合格式儲存示例'
    '串列埠1幀數:'
    '4'
    '串列埠1資料:'
    '時間        引數1    引數2   引數3'
    '00:00:00:000  0.000325 0.000378 0.000598'
    '00:00:00:040  0.000256 0.000245 0.000698'
    '00:00:00:080  0.000369 0.000251 0.000651'
    '00:00:00:120  0.000372 0.000249 0.000648'
    ''
    '串列埠2幀數:'
    '3'
    '串列埠2資料:'
    '時間     引數1     引數2 '
    '00:00:00:000  0.000325 0.000378'
    '00:00:00:040  0.000256 0.000245'
    '00:00:00:080  0.000369 0.000251'
    '00:00:00:120  0.000372 0.000249 '




n1 =


     4




dat1_1 = 


    '00:00:00:000  0.000325 0.000378 0.000598'
    '00:00:00:040  0.000256 0.000245 0.000698'
    '00:00:00:080  0.000369 0.000251 0.000651'
    '00:00:00:120  0.000372 0.000249 0.000648'




dat1_2 =


00:00:00:000  0.000325 0.000378 0.000598
00:00:00:040  0.000256 0.000245 0.000698
00:00:00:080  0.000369 0.000251 0.000651
00:00:00:120  0.000372 0.000249 0.000648




dat1_3 =


   1.0e-03 *


    0.3250    0.3780    0.5980
    0.2560    0.2450    0.6980
    0.3690    0.2510    0.6510
    0.3720    0.2490    0.6480




para1 =


   1.0e-03 *


    0.3780
    0.2450
    0.2510
    0.2490




m =


    11




n2 =


     3




dat2_1 = 


    '00:00:00:000  0.000325 0.000378'
    '00:00:00:040  0.000256 0.000245'
    '00:00:00:080  0.000369 0.000251'
    '00:00:00:120  0.000372 0.000249 '




dat2_2 =


00:00:00:000  0.000325 0.000378
00:00:00:040  0.000256 0.000245
00:00:00:080  0.000369 0.000251
00:00:00:120  0.000372 0.000249




dat2_3 =


   1.0e-03 *


    0.3250    0.3780
    0.2560    0.2450
    0.3690    0.2510
    0.3720    0.2490




n1 = 


    [4]




dat1 = 


    {1x1 cell}




dat1_1 =


   1.0e-03 *


    0.3250    0.3780    0.5980
    0.2560    0.2450    0.6980
    0.3690    0.2510    0.6510
    0.3720    0.2490    0.6480

相關文章