——2020/11/23——
最近在处理dat文件的时候遇到了问题,记录一下:
原文件长这样:(以其中一行为例)
WP, 06, 2019071412, , BEST, 0, 150N, 1351E, 15, 1008, DB, 0, , 0, 0, 0, 0, 1009, 210, 105, 0, 0, , 0, , 0, 0, INVEST, ,
既包含文字又包含数字,还有空格。
- 第一种方法 importdata
importdata其实在这个时候并不好用(也可能是我不会用),在处理前两个文件时,按照一列一个cell读进来了,在处理第三个文件时,突然就自动划分了struct,还丢失了数据,造成了一定的困扰,所以我又研究了第二种办法
- 第二种方法 自定义函数importfile
先上代码
function [data]=importfile(filename1) fidin=fopen(filename1,\'r\'); %打开文件 i=1; data=cell(2,1); while ~feof(fidin) %判断是不是文件末尾 tline=fgetl(fidin); %读取一行,注意,读文一行后,光标就会自动到下一行 if isempty(tline) %判断是不是空行 continue end data{i,1}=tline; i=i+1; end fclose(fidin); end
代码实现的功能为:将dat文件里的数据按行读入,一行存在一个cell里,多个cell构成了data。
函数运用并取出对应行进行输出如下:
DATA=importfile(filename);%自命名函数,filename是地址 k=1; datname=strcat(\'D:\\',temp,\'.dat\'); %temp是文件名,必须为str fid = fopen(datname,\'w\');%写入文件路径 for j=1:length(DATA) temp2=cell2mat(DATA(j,:)); a=regexp(temp2,\',\',\'split\'); %以\',\'为分隔符进行分隔 [r,c]=size(a); if c<28 continue; %如果划分后小于28个,则跳过该次循环 end if strcmp(name,cell2mat(a(1,28))) %对比,判断是我所需要的行则继续 for e=1:r for f=1:c if f==c fprintf(fid,\'%s\',cell2mat(a(e,f))); %fprintf输出 else fprintf(fid,\'%s,\',cell2mat(a(e,f))); end end end fprintf(fid,\'\r\n\'); %换行 k=k+1; end end fclose(fid); %关闭文件
如有错误还请斧正,共同进步~
请发表评论