在MATLAB中跳过读取字符串

时间:2010-03-26 18:52:01

标签: matlab file-io csv

MATLAB中是否有简单的命令可以防止程序在读取字符时崩溃?

我使用xlsread读取(20 400)矩阵数据,第一行和第一列被忽略 因为他们有标题,所以:

data = xlsread ('C:\file.xls') 

导致data的大小为(19 399)。

我遇到了问题,有些单元格缺少数据并且写入“丢失”,而在某些数据集中,我的标题重新出现在中间。

有没有办法在没有程序崩溃的情况下跳过这些字符,我必须在excel中打开文件并删除这些字段?

由于


抱歉迟到了。这是我正在使用的代码:

[a,patha]=uigetfile({'*.csv'},'Select the file' ,'c:\Data\2010'); 
file1=[patha a]; 

%# get a file ID 
fid = fopen(file1,'rt'); 
newf= textscan(fid, ['%s' repmat('%f',1,27)], 'HeaderLines', 1, 'Delimiter', ','); 
fclose(fid) ;

%//Make time a datenum of the first column
time = datenum(newf{1} );

%//Find the difference in minutes from each row
timeDiff = round(diff(datenum(time)*(24*60)));

%//the rest of the data
newf = cell2mat(newf(2:28));

我得到的错误是:

??? Error using ==> cat
CAT arguments dimensions are not consistent.

Error in ==> cell2mat at 81
            m{n} = cat(2,c{n,:});

Error in ==> testprogram at 31
pwr = cell2mat(newf(2:28));

这是由于我选择的文件中的字符。当我手动删除它时它会消失

2 个答案:

答案 0 :(得分:3)

如果字符串与期望不符,则Textscan会失败。当连接时,空条目会导致问题 - 您的数组将具有不均匀的列数。

textscan('bla,5.4,missing,3,3,3.4','%s%f%f%f%f%f','Delimiter',',')

ans = 

    {1x1 cell}    [5.4000]    [0x1 double]    [0x1 double]    [0x1 double]    [0x1 double]

但是,您可以使用'TreatAsEmpty',将'missing'视为空(即它们被NaN取代)

textscan('bla,5.4,missing,3,3,3.4','%s%f%f%f%f%f','Delimiter',',','TreatAsEmpty','missing')

ans = 

    {1x1 cell}    [5.4000]    [NaN]    [3]    [3]    [3.4000]

这使您可以毫无问题地运行cell2mat。

答案 1 :(得分:2)

我不明确具体说明您遇到的导致程序崩溃的问题,因为您没有告诉我们您是如何处理从XLSREAD获取的数据的。但是,也许这会有所帮助......

您可以通过以下方式让XLSREAD从文件中返回数字,文本和原始数据:

[numData,txtData,rawData] = xlsread('C:\file.xls');

对于这种调用语法:

  • 变量numData将仅包含电子表格中的数值。包含非数字数据的任何单元格都设置为NaN
  • 变量txtData将仅包含电子表格中的文本数据。包含数字数据的任何单元格都设置为空字符串('')。
  • 变量rawData将包含电子表格中的所有原始未处理单元格内容,包括数字和文本。

也许您可以使用这些不同的数据形式来帮助您处理其他字符字段。我猜你的问题的一部分可能是因为你正在处理的数字数据中可能有NaN值(在文件中有文本的地方)并且你的处理步骤没有采取考虑到这一点。