matlab 文本文件的读写可以分为两类,一类是高级函数,一类是底层函数。
高级函数运用起来简单,但是定制性差。底层函数用法复杂,灵活性高
对于简单文本读取(文本内容只包括数值,并且以逗号或者空格为分隔符),三个函数用法基本一致。
load、importdata常见用法:
datapath=[datapath,filename]
m=load(datapath)
m=importdata(datapath)
csvread读取csv:
m=csvread('filename',row,col,range)
M=csvread(filename,R1,C1,[R1 C1 R2 C2]) % 仅读取行偏移量 R1 和 R2 及列偏移
读取文件,除了文件名,还指定了开始读取位置的行号(row)和列号(col)。这里行号和列号以0开始计数。也就是说row=0,col=0表示一行一列
range限定了读取范围,range = [R1 C1 R2 C2]。
例如,**偏移量R1=1,C1=0,R2=2,C2=2;**从文件中读取从第2行到第3行,第1列到第3列框定的元素组成一个新的矩阵,叫做M
**注意:**csv文件中的空项,读到矩阵中时,会初始化为0.
dlmread的用法:能够指定分隔符(csvread只能读取逗号分隔符和空格分隔符)
m=dlmread(filename,delimiter)
M=dlmread(filename,"。")
delimiter 为分隔符;
如果行列数不一致的数据, dlmread 会自动在空白数据处补0。
fscanf的用法:按指定格式从文本文件中读取数据
例:文本文件 test.txt 包含以下数据:
1。2。3。1
5。1。1。8
9。7。6。2
4。1。5。1
fid = fopen('test.txt'); %通过fopen获取文件标识
formatSpec = '%d。%d。%d。%d'; %指定读取格式
A = fscanf(fid,formatSpec ,[4,4]); %读取文件数据并存为4*4矩阵
fclose(fid); %调用fclose关闭文件
A = A.’ %由于fscanf是列主序,因此读取完还需要进行转置
A=
1 2 3 1
5 1 1 8
9 7 6 2
4 1 5 1
fid = fopen('test.txt');
A = fscanf(fid,'%d。',[4,4])
fclose(fid);
A = A.'
A=
1 2 3 1
原因:当文件指针读取完13时,formatSpec需要匹配的字符串为“。”,但是1后边的下一字符串为5,匹配失败,fscanf停止读取
复杂文本文件(把数字信息提取出来):
lambda: 7.580000e-05
lambdaB: 8.000000e-05
initial pulse width: 7.853636e-13
output pulse width: 6.253030e-13
dispersion length: 6.307732e-02
nonlinear length: 9.572495e-01
lambda: 7.590000e-05
lambdaB: 8.000000e-05
initial pulse width: 7.848788e-13
output pulse width: 5.778485e-13
dispersion length: 5.852858e-02
nonlinear length: 9.195277e-01
…
dataPath='F:\test.txt'
fid=fopen(dataPath);
c1='%*s %e'; % :"%"后面接一个"*"代表跳过这个数据,%*s即代表跳过第一个字符串’lambda:’,%e表示读取以科学计数
c2 = '%*s %e';
c3 = '%*s %*s %*s %e';
c4 = '%*s %*s %*s %e';
c5 = '%*s %*s %e';
c6 = '%*s %*s %e';
formatSpec=[c1,c2,c3,c4,c5,c6]; % 以6为1组,重复读取,直至读取完整个文件
A=fscanf(fid,formatSpec,[6,inf]) % "A"为变量名
fclose(fid);
% 保存
savepath='F:\xi\'
save(savepath,'A')
%:1、保存指定的变量在 filename 指定的文件中。
save('filename', 'var1', 'var2', ...):
%:2、将工作区中的所有变量保存在当前工作区中的文件中,文件名为 matlab.mat
save
% 3、指定保存文件的格式,格式可以为MAT文件、ASCII文件等。
save('..., 'format')
savepath='F:\xi\';
filename = [savepath,'负载L0.txt']; %自己更改格式
save(filename,'Data_1','-ascii')
%%============Arrange data ===========%%
% 1、清除
clear; % 从工作区中删除项目,释放系统内存
clc; % 清理命令窗口
close all % 移除指定绘画
% 2、保存路径
savepath = 'D:\data\migreadte data\Data of elder brother MAO paper\experimental data\vibration signal\';
% %=====Label-1 Data----负载L0=====%%
% 3、数据来源路径
Datapath='D:\data\migreadte data\Data of elder brother MAO paper\vibration signal\L0\';
% 加载数据
a=load([Datapath,'BL_CamFro_Oil2600_S100_L000_ 18-12-12 13-01-04.mat']);
b=load([Datapath,'TB50_CamFro_S100_L000_ 18-12-17 17-33-45.mat']);
c=load([Datapath,'TB100_CamFro_S100_L000_ 18-12-17 21-28-37.mat']);
d=load([Datapath,'OS_CamFro_Oil1500_S100_L000_ 18-12-14 18-03-14.mat']);
e=load([Datapath,'OS_CamFro_Oil2000_S100_L000_ 18-12-14 13-18-47.mat']);
% 4、整理数据
% 把原始数据第四列,以每次L个长度放入新数组,最终生成大小为2048*100的数组
L=2048
for i=1:100
Data1(:,i) = a.Data(L*(i-1)+1:L*i,4);
Data2(:,i) = b.Data(L*(i-1)+1:L*i,4);
Data3(:,i) = c.Data(L*(i-1)+1:L*i,4);
Data4(:,i) = d.Data(L*(i-1)+1:L*i,4);
Data5(:,i) = e.Data(L*(i-1)+1:L*i,4);
end
% 整合数组(按列拼接),生成大小为2048*500
Data_1 = [Data1,Data2,Data3,Data4,Data5];
% 5、保存文件
savepath1=[savepath,'负载L0.mat']
save(savepath1,'Data_1')