1. 程式人生 > >1.資料的匯入與匯出

1.資料的匯入與匯出

  資料的匯入與匯出

更多MATLAB資料分析視訊請點選,或者在網易雲課堂上搜索《MATLAB資料分析與統計》 http://study.163.com/course/courseMain.htm?courseId=1003615016


          在用MATLAB進行程式設計時,不可避免的要涉及到資料的匯入與匯出,如果資料量比較小,可以通過定義陣列的形式直接把資料寫在程式中,或是把程式直接輸出到MATLAB命令視窗;但是當資料量比較大的時候,這種方法就行不通了。這種情況下就需要從包含資料的外部檔案讀取資料到MATLAB應用程式中,結果的輸出也應該直接寫到資料檔案。

       MATLAB提供了許多檔案讀寫函式,用來讀寫文字檔案和二進位制檔案。利用這些函式可以從文字檔案和二進位制檔案中讀取資料,賦值給變數,也可以把變數的值寫入文字檔案或二進位制檔案。通常情況下,使用者習慣把資料存入記事本檔案(txt檔案)和Excel檔案。本章主要內容就是MATLAB讀取與匯出這兩種型別的檔案,關於MATLAB如何從資料庫中讀入檔案考慮到有的朋友沒有接觸過資料庫,這部分內容將會在以後給出。

  1,Excel檔案的匯入

  呼叫xlsread函式讀取Excel檔案資料

 (1)num=xlsread(filename)

    讀取由filename指定的Excel檔案中第1個工作表中的資料,返回一個雙精度矩陣num。輸入引數filename是由單引號括起來的字串。

  當Excel工作表的頂部或底部有一個或多個非數字行(如上表中的第一行),左邊或右邊有一個或多個非數字列(如第H列)時,輸出中不包括這些行和列。例如,xlsread會忽略一個電子表格頂部的文字說明。

  對於第D列,它是處於內部的列,對於內部的行貨列,即使它有部分是非數字單元格,甚至全部都是非數字單元格,xlsread也不會忽略這樣的行或列,在讀取的矩陣num中,非數字單元格位置用NaN代替。

例:

num=xlsread('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\1_1.xls')

(2)num=xlsread(filename,-1)

  在Excel介面中開啟資料檔案,允許使用者互動式選取要讀取的工作表以及工作表中需要匯入的資料區域。這種呼叫會彈出一個提示介面,提示使用者選擇Excel工作表中的資料區域。在某個工作工作表上單擊並拖動滑鼠即可選擇資料區域,然後單擊提示介面上的“確定”按鈕即可匯入所選區域的資料

例:

num=xlsread('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\1_1.xls',-1)

(3)num=xlsread(filename,sheet)

   用引數sheet指定讀取的工作表,sheet可以是但引號括起來的字串,也可以是正整數,當是字串時,用來指定工作表的名稱;當是正整數時,用來指定工作表的序號。

例:

num=xlsread('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\1_1.xls',1)

(4)num=xlsread(filename,range)

 用引數range指定讀取的單元格區域,range是字串,為了區分sheet和range引數,range引數必須是包含冒號,形如‘C1:C2‘的表示區域的字串。若range引數中沒有冒號,xlsread就會把它作為工作表的名字或序號,這就可能導致錯誤。

例:

num=xlsread('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\1_1.xls','A2:G3')

(5)num=xlsread(filename,sheet,range)

 同時指定工作表和工作表區域。此時,range引數可以是Excel檔案中定義的區域的名字

例:

num=xlsread('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\1_1.xls',1,'A2:G3')

(6)num=xlsread(filename,sheet,range,‘basic’)

用基本模式(basic)讀取資料。當用戶系統沒有安裝Excel時,用這種模式匯入資料,此時匯入功能受限,range引數的值會被忽略,可以設定range引數的值為空字串(‘’),而sheet引數必須是字串,此時讀取的是整個工作表中的資料。

(7)num=xlsread(filename,sheet,range,‘’,functionhandle)

 在讀取電子表格裡的資料之前,先呼叫由函式控制代碼functionhandle指定的函式,它允許使用者在讀取資料之前對資料進行一些操作,例如在讀取資料之前變換資料型別。

 使用者可以編寫自己的函式,把函式控制代碼傳遞給xlsread函式,當呼叫xlsread函式時,它從電子表格讀取資料,把使用者函式作用在這些資料上,然後返回最終結果。

  例:

 function DataRange= setplusonel(DataRange)
%UNTITLED 此處顯示有關此函式的摘要
%   此處顯示詳細說明
for k=1:DataRange.Count
    DataRange.Value{k}=DataRange.Value{k}+1;
    %將單元格取值加1
end

num=xlsread('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\1_1.xls',1,'A2:G3','',@setplusonel)

(8)[num,txt]=xlsread(filename,.....)

     返回數字矩陣num和文字資料txt。

[num,txt]=xlsread('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\1_1.xls')

2.把資料寫入Excel檔案

xlswrite函式用來將資料矩陣M寫入Excel檔案,常用的呼叫格式如下:

xlswrite(filename,M)

xlswrite(filename,M,sheet)

xlswrite(filename,M,range)

xlswrite(filename,M,sheet,range)

status=xlswrite(filename,....)

[status,message]=xlswrite(filename,.....)

其中:

filename為字串變數,用來指定檔名和檔案路徑。若filename指定的檔案不存在,則建立一個新檔案,檔案的副檔名決定了Excel檔案的函式。若副檔名為“.xls”,則建立一個Excel97-2003下的檔案;若副檔名為“.xlsx”、".xlsb"或“.xlsm”,則建立一個Excel2007格式的檔案。

 M可以是一個mxn的數值型矩陣或字串型矩陣,也可以是一個mxn的元胞陣列。

 sheet用來指定工作表,可以是代表工作表序號的正整數,也可以是代表工作表名稱的字串。若由sheet指定名稱的工作表不存在,則在所有工作表的後面插入一個新的工作表。若sheet為正整數,並且大於工作表的總數,則追加多個空的工作表知道工作表的總數等於sheet。這兩種情況都會產生一個警告資訊,表明增加了新的工作表。

 range用來指定單元格區域,對於第三種呼叫格式,range必須包含冒號,形如‘C1:C2’的表示單元格區域的字串。range指定的單元格區域的大小要與M的大小相匹配,若單元格區域超出了M的大小,則多餘的單元格用#N/A填充,若單元格區域小於M的大小,則只寫入與單元格區域相匹配的部分資料

 輸出status反映了寫操作完成的情況,若成功完成,則status等於1(真),否則,status等於0(假),只有在指定輸出引數的情況下,xlswrite函式才返回status值

 輸出message中包含了寫操作過程中的警告和錯誤資訊,它是一個結構體變數,有兩個欄位:message和identifier。其中,message是包含警告和錯誤資訊的字串,identifier也是字串,包含了警告和錯誤資訊的識別符號。

例:

生成一個10x10的矩陣,將它寫入excel中

 x=rand(10);%生成一個10行10列在[0 1]上均勻分佈的隨機矩陣

[s,t]=xlswrite('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\save_2_1.xls',x,2,'D6:M15')

%把矩陣x寫入檔案save_2_1.xls中的第2個工作表中的單元格D6:M15,並返回操作資訊
s =

     1


t =

       message: ''
    identifier: ''

上面返回的操作資訊變數s=1,變數t的message欄位為空,說明操作成功,沒有出現任何警告,資料被寫入檔案save_2_1.xls中的指定文字。

例:定義一個元胞陣列,將它寫入Excel檔案save_2_1.xls的自命名工作表的指定區域

(注:元胞陣列是MATLAB的一種特殊資料型別,可以將元胞陣列看做一種無所不包的通用矩陣,或者叫做廣義矩陣。組成元胞陣列的元素可以是任何一種資料型別的常數或者常量,每一個元素也可以具有不同的尺寸和記憶體佔用空間,每一個元素的內容也可以完全不同,所以元胞陣列的元素叫做元胞(cell)。和一般的數值矩陣一樣,元胞陣列的記憶體空間也是動態分配的。 可用換括號“{}”來建立,用逗號或者空格來分隔每一個單元,使用分號“;”來分行。)

x={1,101,6010101,'張三',61,'';2,101,6010102,'李四',70,'';3,101,6010103,'王五',0,'缺考'}%定義一個元胞陣列

x =

    [1]    [101]    [6010101]    '張三'    [61]    ''  
    [2]    [101]    [6010102]    '李四'    [70]    ''  
    [3]    [101]    [6010103]    '王五'    [ 0]    '缺考'

>> xlswrite('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\save_2_1.xls',x,'chengji','A3:F5')

例:讀取1_1.xls檔案中的數值型資料,並將讀取的資料寫入檔案save_2_1.xls的自命名工作表的預設區域

num=xlsread('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\1_1.xls');
>> %讀取檔案1_1.xls中的資料
>> %把讀取到的資料num寫入save_2_1.xls中名稱為“成績”的工作表的預設區域
>> xlswrite('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\save_2_1.xls',num,'成績')

3.讀取txt檔案

 3.1呼叫importdata函式讀取資料

  (1)importdata(filename)

     把資料從檔案匯入MATLAB工作空間,filename為字串,用來指明檔名,若檔名中不指定檔案完整路徑,則資料檔案一定要在當前目錄或MATLAB搜尋路徑下才行, 利用其它函式讀取資料也要滿足這個基本要求,在這種呼叫格式下,importdata函式自動識別資料間隔符,讀取的資料賦值給變數ans

 例:

 importdata('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\3_1.txt')

  (2)A=importdata(filename)

           讀取的資料賦值給變數A

例:

 A=importdata('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\3_1.txt')

  (3)A=importdata(filename,delimiter)

       用delimiter指定資料列之間的分隔符(如‘\t’表示Tab製表符),把資料從檔案filename匯入MATLAB工作空間,讀取的資料賦值給變數A

    A=importdata('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\3_2.txt',',')

 (4)[A D]=importdata(.......)

           返回結構體陣列賦值給A,返回分隔符賦值給D

    例:

   [A D]=importdata('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\3_3.txt')

 (5)[A D H]=importdata(.......)

          返回結構體陣列賦值給A,返回分隔符賦值給D,返回的標頭檔案行數賦值給H

例:

[A D h]=importdata('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\3_3.txt')

3.2 呼叫load函式讀取資料

  例如 :

  x1=load('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\3_1.txt')

3.3 呼叫dlmread函式讀取資料

 dlmread函式常用格式如下:

 M=dlmread(filename)

 M=dlmread(filename,delimiter)

 M=dlmread(filename,delimiter,R,C)

 M=dlmread(filename,delimiter,range)

其中:

 filename指定檔名;

delimiter指定資料列之間的分隔符,預設分隔符為逗號;

R,C分別指定讀取資料的起始行和列,R指定行,C指定列,R和C取值都是從0開始,R=0和C=0分別表示檔案的第一行和第一列

range=[R1,C1,R2,C2]用來指定讀取資料的範圍,(R1,C1)表示讀取的資料矩陣的左上角的行和列,(R2,C2)表示右下角的位置(行和列)。

例:

x=dlmread('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\3_2.txt')

 x=dlmread('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\3_2.txt',',',2,3)

 x=dlmread('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\3_2.txt',',',[1,2,2,5])

注:dlmread函式適合讀取全是資料的檔案,資料間可以用空格、逗號、分號分隔,也可以用其他字串分隔(不要用%分隔),但是當同一資料檔案中有多種分隔符時,dlmread就不能正確的讀取了。

3.4 呼叫textread函式讀取資料

  textread函式可按使用者指定格式讀取文字檔案中的資料,還可以同時指定多種資料分隔符。

  (1)[A,B,C,.....]=textread(‘filename’,‘format’)

     以使用者指定格式從資料檔案中讀取資料,賦值給變數A,B,C,....等。filename為資料檔案的檔名,format用來指定讀取資料的格式,它確定了輸出變數的個數和型別。可用的format字串如下表

格式字串        說明

%d              讀取一個無符號整數,例如%5d指定讀取的無符號整數的寬度為5

%u                讀取一個整數

%f                      浮點數

%s           字串

%q           讀取一個雙引號例的字串,不包括引號

%c            讀取多個字元,包括空格符,例%5c 表示讀取5個字元

%[......]       讀取包含方括號中字元的最長字元

%[^.....]       讀取不包含方括號中字元的非空最長字串

%*.....          忽略與*號後字元相匹配的內容,例如%*f 表示忽略浮點數

%w......          指定讀取內容的寬度

(2)[A,B,C,.....]=textread(‘filename’,‘format’,N)

 若N為正整數,則重複使用N次由format指定的格式讀取資料;若N<0,則讀取整個檔案

(3)[.....]=textread(....,'param','value',....)

     設定成對形式出現的引數名和引數值,可以更為靈活的讀取資料。字串param用來指定引數名,value用來指定引數的取值。例如param可取為‘delimiter’(分隔符),value可取‘,;*’(,;*為分隔符)

例:檔案中文字與資料交替出現,通過設定format引數,用冒號和空格(‘:  ’)作為分隔符,可以讀取檔案中的文字和資料

format='%s %s %s %d %s %d %s %d %s';

[c1,c2,c3,c4,c5,c6,c7,c8,c9]=textread('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\3_4.txt',format,'delimiter',':');

總結:

對於資料量比較小的資料檔案,dlmread和load所用時間比較短,textread函式次之,importdata函式用時最長。而對於比較大型的資料,dlmread函式用時最短,textread函式次之,load和importdata函式用時比較長。

4.把資料寫入txt檔案

dlmwrite函式用來將矩陣資料寫入文字檔案。呼叫格式如下:

 (1)dlmwrite(filename,M)

          預設用逗號作分隔符,將M矩陣的資料寫入filename指定的檔案中。filename為字串變數,用來指定目標檔案的檔名,可以包含路徑,若不指定路徑,則自動儲存到MATLAB當前資料夾。M為寫入的矩陣

例:

 x=rand(10)

dlmwrite('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\4_1.txt',x)

  (2)dlmwrite(filename,M,‘D’)

          指定分隔符,將M矩陣的資料寫入filename指定的檔案中,D為單個字元,用來指定資料分隔符,例如‘ ’表示空格,‘\t’表示製表符

例:

dlmwrite('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\4_2.txt',x,';')

    (3)dlmwrite(filename,M,‘D’,R,C)

     允許使用者從目標檔案的第R行、第C列開始寫入資料。R表示M矩陣的左上角行數,C表示列數。R和C都是從0開始,即R=0和C=0表示第一行第一列。

  (4)dlmwrite(filename,M,‘attribute1’,value1,‘attribute2’,value2,.......)

     利用可選的成對出現的引數名和引數值來控制寫入檔案的方式,可用的引數名(attribute)與引數值(value)如下表

  引數名                 引數值                                          說明

delimiter           單個字元,如‘,’,‘ ’,‘\t’等     設定資料間分隔符

newline            ‘pc’                                                        設定換行符為‘\r\n’

newline                 'unix'                                         設定換行符為‘\n’

roffset                 通常為非負整數                         M矩陣的左上角在目標檔案中所處的行

coffset                  同時為非負整數                        M矩陣的左上角在目標檔案中所處的列

precision            以%號引導的精度控制符,如‘%10.5f’   用來指定有效位數

例:

 dlmwrite('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\4_4.txt',x,'delimiter',';','newline','pc','roffset',3,'coffset',3)

(5)dlmwrite(filename,M,‘-append’)

   如指定的檔案存在,則從原檔案內容的後面續寫資料,當不設定‘-append’選項時,將清除原檔案內容,重新寫入資料。如指定檔案不存在,則建立一個新檔案並寫入矩陣資料。

 dlmwrite('C:\Users\Administrator\Desktop\MATLAB\MATLAB資料分析與統計\chapter1\4_5.txt',x,'delimiter',';','newline','pc','-append')

更多MATLAB資料分析視訊請點選,或者在網易雲課堂上搜索《MATLAB資料分析與統計》 http://study.163.com/course/courseMain.htm?courseId=1003615016