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));
这是由于我选择的文件中的字符。当我手动删除它时它会消失
答案 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值(在文件中有文本的地方)并且你的处理步骤没有采取考虑到这一点。