MATLAB匯入txt和excel檔案技巧彙總:批量匯入、單個匯入

奈何緣淺發表於2021-07-04

在使用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檔案

  1. num=xlsread(filename)
    filename是單引號括起來的帶路徑的檔名,函式直接讀取filename所指檔案的sheet1中的資料區域儲存到雙精度矩陣num中;其中,資料區域的選取規則是:對錶格前幾個含有非數值的行(列)直接忽略,不算入資料區域。

  2. num = xlsread(filename, -1)
    輸入後matlab將會開啟相應的exel檔案,用滑鼠選擇需要匯入的資料區域,可以切換到想要的sheet。

  3. num = xlsread(filename, sheet)
    其中sheet用來指定讀入excel檔案的第幾個sheet,此時的sheet取值大於1的整數。

  4. 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秋招】 即可獲取相應的驚喜哦!

「❤️ 感謝大家」

  • 點贊支援下吧,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
  • 歡迎在留言區與我分享你的想法,也歡迎你在留言區記錄你的思考過程

相關文章