作业帮 > 综合 > 作业

matlab里怎么读文本中括号里的字符

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/05/23 00:30:01
matlab里怎么读文本中括号里的字符
学号 姓名 英语 总分 平均分
1234567890 fgtfj 78.0( ok) 98.0(great) 99.0(great) 275.0 91.7
123143435 czcvcv 54.0( bad) 76.0( ok)) 87.0(nice) 217.0 72.3
1243546688 safdsf 34.0( bad) 67.0( bad) 87.0(nice) 188.0 62.7
用这个程序读上面的文本的时候总是会多出一个括号,这是为什么
##########################################
fid = fopen('student.txt','r');
n = 1;
fgets(fid); %读取第一行的文件头,读到的内容我们扔掉不要
while feof(fid) %feof判断文件是否读到文件尾
tmp = fscanf(fid,'%d',1); %如果是一个空行,读到的内容是空的
if isempty(tmp)
continue;
end
stu(n).id = tmp;
stu(n).name = fscanf(fid,'%s',1);
stu(n).math{1} = fscanf(fid,'%f',1);
fscanf(fid,'%c',1); %读括号
stu(n).math{2} = fscanf(fid,'%s',1);
fscanf(fid,'%c',1);
stu(n).eng{1} = fscanf(fid,'%f',1);
fscanf(fid,'%c',1);
stu(n).eng{2} = fscanf(fid,'%s',1);
fscanf(fid,'%c',1);
stu(n).phy{1} = fscanf(fid,'%f',1);
fscanf(fid,'%c',1);
stu(n).phy{2} = fscanf(fid,'%s',1);
fscanf(fid,'%c',1);
stu(n).sum = fscanf(fid,'%f',1);
stu(n).ave = fscanf(fid,'%f',1);
n = n+1;
end
fclose(fid);
####################################
读出来结果就变成这样了
学号 姓名 英语 总分 平均分
1234567890 fgtfj 78.0( ok)) 98.0(great)) 99.0(great)) 275.0 91.7
123143435 czcvcv 54.0( bad)) 76.0( ok)) 87.0(nice)) 217.0 72.3
1243546688 safdsf 34.0( bad)) 67.0( bad)) 87.0(nice)) 188.0 62.7
各科分数后面多了个),
在读取%s的时候,会把)也读进去的
所以不能简单用fscanf的%s读取括号内信息
fid = fopen('student.txt','r');
n = 1;
fgets(fid); %读取第一行的文件头,读到的内容我们扔掉不要
while feof(fid) %feof判断文件是否读到文件尾
tline=fgetl(fid);
a=regexp(tline,'[\s()]+','split');
while(~isempty(a)&&isempty(a{1}))
a=a(2:end);
end
if isempty(a)%如果是一个空行,读到的内容是空的
continue;
end
stu(n).id = str2num(a{1});
stu(n).name = a{2};
stu(n).math{1} = str2num(a{3});
stu(n).math{2} = a{4};
stu(n).eng{1} = str2num(a{5});
stu(n).eng{2} = a{6};
stu(n).phy{1} = str2num(a{7});
stu(n).phy{2} = a{7};
stu(n).sum = str2num(a{9});
stu(n).ave = str2num(a{10});
n = n+1;
end
fclose(fid);