MATLAB中的跳读字符串

MATLAB中的跳读字符串,matlab,file-io,csv,Matlab,File Io,Csv,MATLAB中是否有防止程序在读取字符时崩溃的简单命令 我使用xlsread读取(20 400)矩阵数据,第一行和第一列被忽略 因为它们有标题,所以: data = xlsread ('C:\file.xls') 结果为数据,大小为(19399) 我有一个问题,一些单元格缺少数据,它被写为“缺少”,在一些数据集上,我的标题重新出现在中间 有没有一种方法可以跳过这些字符,而不会导致程序崩溃,我必须在excel中打开文件并删除这些字段 谢谢 很抱歉更新太晚。以下是我正在使用的代码: [a,pa

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

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

data = xlsread ('C:\file.xls') 
结果为
数据
,大小为(19399)

我有一个问题,一些单元格缺少数据,它被写为“缺少”,在一些数据集上,我的标题重新出现在中间

有没有一种方法可以跳过这些字符,而不会导致程序崩溃,我必须在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));

这是由于我选择的文件中的字符造成的。当我手动删除它们时,它消失了。我不知道您具体遇到了什么问题导致程序崩溃,因为您没有告诉我们如何处理从中获取的数据。然而,也许这会有帮助

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

[numData,txtData,rawData] = xlsread('C:\file.xls');
对于此调用语法:

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

也许您可以对数据使用这些不同的表单来帮助您处理附加的字符字段。我猜您的部分问题可能是因为您正在处理的数字数据中可能有值(在文件中有文本的地方),而您的处理步骤没有考虑到这一点。

我不知道您具体遇到了什么问题导致程序崩溃,因为您还没有告诉我们您是如何处理从中获取的数据的。然而,也许这会有帮助

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

[numData,txtData,rawData] = xlsread('C:\file.xls');
对于此调用语法:

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

也许您可以对数据使用这些不同的表单来帮助您处理附加的字符字段。我猜部分问题可能是因为您正在处理的数字数据中可能有值(在文件中有文本的地方),而您的处理步骤没有考虑到这一点。

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”视为空(即,它们被NaNs替换)


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

如果字符串与预期不匹配,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”视为空(即,它们被NaNs替换)


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

xlsread
是可用于读取
.XLS
文件的全部内容。也许您可以使用Excel将数据导出到CSV,然后使用
dlmread
textscan
?或者,您可以将
xlsread
放在
try catch
块中以避免崩溃。您甚至可以使用
range
参数一次调用一行
xlsread
,让
try catch
逻辑跳过数据不正确的行。好吧,即使对于.txt和.csv,我也有同样的问题,当文件中间有一些字符时,如何读取它们rows@Paul:您使用的是什么MATLAB版本?我有R2009b,所以它的版本是特定的?@Paul:如果您告诉我们程序是如何崩溃的,那会有帮助。
xlsread
是所有可以读取的
.XLS
文件。也许您可以使用Excel将数据导出到CSV,然后使用
dlmread
textscan
?或者,您可以将
xlsread
放在
try catch
块中以避免崩溃。您甚至可以使用
range
参数一次调用一行
xlsread
,让
try catch
逻辑跳过数据不正确的行。好吧,即使对于.txt和.csv,我也有同样的问题,当文件中间有一些字符时,如何读取它们rows@Paul:你使用的是什么MATLAB版本?我有R2009b,所以它的版本是特定的?@Paul:如果你告诉我们程序是如何崩溃的,那会有帮助。[c,pathc]=uigetfile({'*.txt'},'Select the data','V:\data);文件=[pathc];数据=dlmread(文件“,”,1,4);上面是我的代码。无论如何,要像上面使用的那样使用代码,所以如果在文件中间以字符串形式写入一行,它不会停止。[c,pathc]=uigetfile({'*.txt'},'Select the data',V:\data);文件=[pathc];数据=dlmread(文件“,”,1,4);上面是我的代码。无论如何,要像上面使用的那样使用代码,所以如果一行是在文件中间的字符串中写入的,它不会停止?例如,如果标题在fileTextscan的中间重新出现,那么如果您知道字符串是什么,那么Scan是非常好的。如果你不喜欢,我会选择xlsread(或文本)