在使用MATLAB的時候,想必各位一定會遇到匯入資料的問題。如果需要匯入的資料其資料量巨大的話,那麼在MATLAB編輯器中將這些資料複製貼上進來,顯然會在編輯器中佔據巨大的篇幅,這是不明智的。
一般來說儲存這些資料的檔案有兩種形式:
- txt檔案
- excel表格
針對這兩種型別的檔案,需要使用兩個不同的函式。
就匯入txt檔案來說,個人習慣使用importdata這個函式。
@
匯入txt檔案
01 | 匯入全是數字型別的txt檔案(一)
如果匯入的txt檔案中,儲存的資料全是數字型別的,且同一行的兩個數字之間使用空格或者製表符進行分隔。這種形式的txt檔案如下所示。
儲存這種形式資料的txt檔案直接使用如下程式碼即可。
present01=importdata('present01.txt');
在MATLAB執行之後的結果如下:
02 | 匯入全是數字型別的txt檔案(二)
如果資料不像剛才給出的資料那麼規整,那麼就不能繼續使用上面的程式碼了
如果txt檔案儲存如下的資料:
很明顯這個txt檔案,第一行只有1,第二行有2和3,第三行有4、5、6和7,第四行有8、9、10和11,第五行有12、13、14和15。
如果我們繼續使用上面的程式碼,看看能否成功匯入資料。
present02=importdata('present02.txt');
在MATLAB執行之後結果如下,是一個15行1列的矩陣,這個很明顯和我們想要的形式不太一樣。
可以發現前兩行的資料個數與後三行的資料個數不同,所以在實際匯入的時候需要分開匯入,這時可以使用如下程式碼匯入present02.txt檔案。
filename='present02.txt'; %檔名
delimiterIn = ' '; %列分隔符
headerlinesIn = 2; %讀取從第 headerlinesIn+1 行開始的數值資料
present02=importdata(filename,delimiterIn,headerlinesIn);
dataset=present02.data; %匯出的3行以後的資料,即3行4列的矩陣
parameters=present02.textdata; %匯出的2行以前的資料,即2行1列的元胞陣列
- filename是檔名
- delimiterIn是列分隔符,也就是同一行的兩個資料之間是如何分隔的,可以是空格,也可以是製表符,也可以是逗號
- headerlinesIn表示讀取從第 headerlinesIn+1 行開始的數值資料,因為前兩行的資料個數與後三行的資料個數不同,所以這裡headerlinesIn = 2,即從讀取從第 3行開始的數值資料。
在MATLAB執行之後的結果如下,是一個結構體,其中包括一個3行4列的矩陣data,和一個2行1列的元胞陣列textdata。使用變數dataset儲存這個3行4列的矩陣,使用parameters儲存這個2行1列的元胞陣列。
其中這個3行4列的矩陣data就是後三行的資料,這個2行1列的元胞陣列textdata就是前兩行的資料。
其實在MATLAB中建議不到萬不得已的時候儘量不用元胞陣列cell,因為元胞陣列在處理資料時不方便。但這個txt檔案由於每行的資料個數不同,所以我們沒有辦法將其匯入為一個5行4列的矩陣,我們才萬不得已將前兩行資料匯入為元胞陣列,後三行資料匯入為3行4列的矩陣。
03 | 匯入全是數字型別的txt檔案(二)擴充
在上述程式碼中將headerlinesIn設為5,匯入的結果
filename='present02.txt'; %檔名
delimiterIn = ' '; %列分隔符
headerlinesIn = 5; %讀取從第 headerlinesIn+1 行開始的數值資料
present02=importdata(filename,delimiterIn,headerlinesIn);
在MATLAB執行之後的結果如下,是一個5行1列的元胞陣列。
因為一共只有5行資料,而又將headerlinesIn設為5,所以此時讀取從第6行開始的數值資料,這句話包含兩層意思:1)讀取從第6行開始的數值資料,在present02.txt檔案中第6行沒有資料,所以沒有將資料以矩陣的形式匯入進來。2)讀取第5行之前的非數值資料,然後用元胞陣列cell的形式進行儲存。
04 | 匯入數字和字母混合型別的txt檔案
比如說現在匯入標準的solomon測試算例,前8行中既有數字又有字母,且每行資料個數不同。
觀察發現,第10行以後的資料是一個101行7列的規整的資料。因此,可以將headerlinesIn設為9,具體的程式碼如下:
filename = 'c101.txt'; %檔名
delimiterIn = ' '; %列分隔符
headerlinesIn =9; %讀取從第 headerlinesIn+1 行開始的數值資料
c101=importdata(filename,delimiterIn,headerlinesIn);
row4=c101.textdata{4,1};
len=length(row4);
dataset=c101.data; %匯出的10行以後的資料,即101行7列的矩陣
parameters=c101.textdata; %匯出的9行以前的資料,即7行1列的元胞陣列
在MATLAB執行之後的結果如下:
05 | 匯入同一個檔案中的多個txt 檔案
matlab中給我們提供了dir
這個函式,十分方便。這裡是讀取所有txt檔案,所以是dir('父目錄路徑\*.txt')
%讀取該目錄下的所有txt檔案
% namelist = dir('C:\Users\Administrator\Desktop\xxx\*.txt');
% 讀取後namelist 的屬性有
% name -- filename
% date -- modification date
% bytes -- number of bytes allocated to the file
% isdir -- 1 if name is a directory and 0 if not
%通過字串拼接,獲取絕對路徑可以直接用[],也可以用strcat()函式
path = 'C:\Users\Administrator\Desktop\xxx\';
namelist = dir([path,'*.txt']);
l = length(namelist);
P = cell(1,l);%定義一個細胞陣列,用於存放所有txt檔案
for i = 1:l
namelist(i).name;%這裡獲得的只是該路徑下的檔名,如1.txt是相對路徑
filename{i} = [path,namelist(i).name];%通過字串拼接獲得的就是絕對路徑了
P{1,i} = load(filename{i});
end
面對多個 .txt 檔案的依次讀入,且檔名按一定的規律命名,如:filename1.txt,filename2.txt,... 。是純數字資料型別的文字(不摻雜字元型別)依次讀入,我們可以將其儲存為cell資料型別,以便於後面關於資料的操作。在這裡我們舉一個例子:假如有10個 .txt 檔案,我們把這些資料讀入並儲存為cell資料型別。我們可以使用迴圈依次讀入檔案,Matlab 程式如下:
data = cell(1,10); %建立細胞儲存空間
for i = 1:10
g = ['filename' num2str(i) '.txt'];
data(1,i) = {textread(g)};%讀入 .txt 檔案置於 data 細胞中
end
對於讀入的cell資料的顯示,我們可以採用 : data{m,n}(p,q); %對存入的cell資料進行顯示
在 .txt 檔案中摻雜著字母+數字 型別的,我們同樣也可以儲存為struct 結構體資料的型別。這裡我們再舉一個列子。比如:兩幅帶有英文+數字的 .txt檔案。我們將其讀入並儲存為結構體型別。
for i=1:2
str=strcat('filename',num2str(i),'.txt');
hh{1}{i}=importdata(str);
end
對於讀入的struct資料的顯示,我們可以採用:pp.textdata(2)%資料顯示
匯入Excel檔案
01 | 用xlsread函式讀取一個Excel檔案
-
num=xlsread(filename)
filename是單引號括起來的帶路徑的檔名,函式直接讀取filename所指檔案的sheet1中的資料區域儲存到雙精度矩陣num中;其中,資料區域的選取規則是:對錶格前幾個含有非數值的行(列)直接忽略,不算入資料區域。 -
num = xlsread(filename, -1)
輸入後matlab將會開啟相應的exel檔案,用滑鼠選擇需要匯入的資料區域,可以切換到想要的sheet。 -
num = xlsread(filename, sheet)
其中sheet用來指定讀入excel檔案的第幾個sheet,此時的sheet取值大於1的整數。 -
num = xlsread(filename,sheet, 'range')
其中range指定一個矩形的區域,用單引號括起來;例如:'D2:H4
'代表以D2和H4為對角定點的矩形域;
注意當excel中有合併單元格時,任何一個合併前的單元格的名字(比如D1)都會指代整個合併後的單元格,而將整個單元格讀入,所以為了避免麻煩,儘量避免在需要讀入的表格中合併單元格。
例如:將讀取D盤下的一個檔案路徑為:D:/test/daxia.xls
num = xlsread('d:/test/daxia.xls',2,'D2:H4')
讀取sheet2的D2:H4區域資料
如果要進行互動式的選擇用:num= xlsread('d:/test/daxia.xls',-1)
02 | 批量的檔案要讀取
首先將多個檔案進行批量重新命名例如daxia1.xls,daxia2.xls,daxia3.xls,...
然後用迴圈的方式實現:
for i=1:100
filename=['d:/test/daxia',num2str(i),'.xls'];
num=xlsread(filename)
end
資源傳送門
- 關注【做一個柔情的程式猿】公眾號
- 在【做一個柔情的程式猿】公眾號後臺回覆 【python資料】【2020秋招】 即可獲取相應的驚喜哦!
「❤️ 感謝大家」
- 點贊支援下吧,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
- 歡迎在留言區與我分享你的想法,也歡迎你在留言區記錄你的思考過程