基于Matlab 2018b的dat文件读取及输出

——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);  %关闭文件

如有错误还请斧正,共同进步~