使用命令fprintf将行写入.csv文件失败

时间:2014-05-12 12:16:01

标签: matlab csv

我想访问.csv文件,查找空数据块并存储所有没有空数据块的行。

这是我的代码:

   filename = 'C:\Users\try.csv'; 
   file1 = fopen(filename);     %Acces file with empty data blocks
   filename2 = 'C:\Users\try_corrected.csv';
   file2 = fopen(filename2);    %Acces destination file

   tline = fgets(file1);        %Read the first line of file1

   while ischar(tline)

       detected = false;
       [r,s] = size(tline);     %Determine the lengt of the textline for the for-loop

       for(i=1: 1: s)
           if( (tline(i)==',' && tline(i+1) ==',') || tline(1)==',' || tline(s-2)==',' )

              detected = true   %Line should not be printed in destination file
              break;

           end
       end

       if detected == false
          fprintf(file2,'%s\n',tline);
       end

       tline = fgets(file1);

  end

  type 'C:\Users\try_corrected.csv'
  fclose(file2);

  textdata = textscan(file1, '%s %f %f %f %s %f %f %f %s %f %s','HeaderLines', 1,'Delimiter',',');
  fclose(file1);

如果我执行“type”命令,我应该看到所有打印的字符串不是这种情况。 我使用fprintf错了吗?我知道有一个名为csvwrite的命令,但我认为这也可行吗?

1 个答案:

答案 0 :(得分:0)

首先,当您打开目标文件时,需要将其打开以进行写入。如果没有第二个参数,fopen将打开以进行读取访问。如果您的目标文件不存在,它将返回-1文件句柄。

改为使用:

fopen(filename2,'w')

以下是您的代码的简化版本,包括该修订:

filename = 'c:\try.csv'; 
fid_in = fopen(filename,'r');     %Access file with empty data blocks
filename2 = 'C:\try_corrected.csv';
fid_out = fopen(filename2,'w');    %Access destination file

while (~feof(fid_in))
    str=fgets(fid_in);
    if (~doublecommas(str))
        fprintf(fid_out,'%s',str);
    end    
end

fclose(fid_in);
fclose(fid_out);

type(filename2)

这使用不同的方法来检测CSV行中是否存在双重逗号:

function flag=doublecommas(str)

    flag=false; % flag = result returned, 
                %        true if empty CSV fields present in line

    if (ischar(str) && length(str)>0)

        for cindex=1:length(str)-1
            if strcmp(str(cindex:(cindex+1)),',,')
                flag=true; break;
            end
        end

    end

return;