将mat文件中的数据按要求保存到txt文档中(批处理)
之前有个老朋友,让帮忙将一个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
结果如下: