之前有個老朋友,讓幫忙將一個mat中的數據重新保存到txt中,由於數據比較多需要用到批處理,之前弄過很多次,但每次一到要用的時候總是忘記怎么寫了,現在記錄一下,免得后面老是需要上網搜。這里先說一個比較有意思的matlab函數--dlmwrite,用這個函數將數據導入到txt文件中,其實用save也是可以的,但是這個函數的功能更強大,而且可以按不同的要求導入數據。因為將數據導入到txt中時,需要用逗號分隔,其主要函數格式如下:
使用默認的分隔符(')將矩陣M寫入ASCII格式的文件中。在目標文件filname中,數據是從第一行的第一列開始寫的。輸入的filename是使用單引號括起來的字符串。
2.dlmwrite(filename, M, 'D')
將矩陣M寫入一個ASCII格式的文件中,使用分隔符D來分割矩陣的元素。在目標文件filname中,數據是從第一行的第一列開始寫的。逗號'是默認的分隔符,使用\t來產生制表符分割的文件。
還有不少帶其他參數的格式,大家可以根據自己需要進行百度。
一 需求分析
首先,加載后是一個元胞數組results,里面有一個1*1的結構體,結構體里面放了數據的一些信息,需要導出的是res這個double矩陣里面的數據,如下所示:
保存之后的數據用逗號分隔。
二 單個mat數據保存到txt中
如果只是保存一個mat中的數據還是很好做的,用剛才提到的dlmwrite函數就可以很輕松的做到,代碼如下:
clear,clc; a = load('OPE_Basketball.mat'); b = a.results; dlmwrite('res2.txt',b{1,1}.res,'delimiter',',','newline','pc');
保存之后的結果如下:
三 批處理導入
用於保存的txt文檔的名字應該跟原mat的名字對應起來,比如basketball.mat導入到txt中后,該txt的名字應該是basketball.txt。因此需要用到dir函數獲取文件夾下的mat文件的名字,代碼如下:
namelist = dir('.\*.mat'); len = length(namelist); for i = 1:len %循環讀取當前文件夾下的.mat文件 file_name{i}=namelist(i).name; a= load(file_name{i}); b = a.results; %取出其中的數據 wname = file_name{i}; % 取出mat文件的名字,用於給txt文件命名。 wname = ['.\',wname,'.txt']; % 用來保存數據的txt文檔的名字,只能用[],不能直接相加 dlmwrite(wname,b{1,1}.res,'delimiter',',','newline','pc'); %把數據輸出到txt文件中 end
其結果是:
數據沒什么問題,但是txt文件的名字有問題,主要是讀取的時候連后綴那些也取出來了,由於前后的字符數都是一樣的,所以將mat文件名取出來的時候可以直接截取中間部分。網上有不少matlab截取字符的函數,這里的話,直接用下標截取是最方便的。代碼如下:
namelist = dir('.\*.mat'); len = length(namelist); for i = 1:len %循環讀取當前文件夾下的.mat文件 file_name{i}=namelist(i).name; a= load(file_name{i}); b = a.results; %取出其中的數據 wname = file_name{i}(5:end-4); % 取出mat文件的名字,用於給txt文件命名。 取字符串的第五個到倒數第四個子串 wname = ['.\',wname,'.txt']; % 用來保存數據的txt文檔的名字,只能用[],不能直接相加 dlmwrite(wname,b{1,1}.res,'delimiter',',','newline','pc'); %把數據輸出到txt文件中 end
現在基本上就沒什么問題了,如下:
如果需要將這些txt文檔放在指定文件下,只需要修改一下路徑就可以了,比如:
namelist = dir('.\*.mat'); len = length(namelist); for i = 1:len %循環讀取當前文件夾下的.mat文件 file_name{i}=namelist(i).name; a= load(file_name{i}); b = a.results; %取出其中的數據 wname = file_name{i}(5:end-4); % 取出mat文件的名字,用於給txt文件命名。 取字符串的第五個到倒數第四個子串 wname = ['.\li\',wname,'.txt']; % 用來保存數據的txt文檔的名字,只能用[],不能直接相加 dlmwrite(wname,b{1,1}.res,'delimiter',',','newline','pc'); %把數據輸出到txt文件中 end
結果如下: