【问题标题】:Skip reading strings in MATLAB跳过在 MATLAB 中读取字符串
【发布时间】:2010-03-26 18:52:01
【问题描述】:

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));

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

【问题讨论】:

  • xlsread 是可用于读取 .XLS 文件的所有内容。也许您可以使用 Excel 将数据导出为 CSV,然后使用dlmreadtextscan?或者,您可以将xlsread 放在try-catch 块中以避免崩溃。您甚至可以使用range 参数一次调用xlsread 一行,并让try-catch 逻辑跳过包含错误数据的行。
  • 好吧,即使是 .txt 和 .csv 我也有同样的问题,当某些行的文件中间有字符时,我该如何阅读它们
  • @Paul:你用的是什么 MATLAB 版本?
  • 我有 R2009b,所以它的版本特定?
  • @Paul:如果您告诉我们如何程序崩溃了,将会有所帮助。

标签: matlab file-io csv


【解决方案1】:

如果字符串与预期不匹配,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。

【讨论】:

  • 当我们不知道字符串是什么时,无论如何使用类似的代码?例如,如果标题重新出现在文件中间
  • 如果您知道字符串是什么,Textscan 非常好。如果你不这样做,我会使用 xlsread (或者使用 textread 然后测试输入的内容)。
  • 这里是文件 [c,pathc]=uigetfile({'*.txt'},'Select the data','V:\data);文件=[路径 c];数据= dlmread(文件,',',1,4);我如何在此处合并 txtread?
  • 嗯,这有点复杂。我想你最好问一个新问题——等你已经问过了,对吧?那就别管了。
【解决方案2】:

我不知道具体是什么问题导致程序崩溃,因为您没有告诉我们您是如何尝试处理从XLSREAD 获得的数据。但是,也许这会有所帮助...

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

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

对于这个调用语法:

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

也许您可以使用这些不同的数据形式来帮助您处理额外的字符字段。我猜您的部分问题可能是由于您正在处理的数字数据中可能包含 NaN 值(在文件中有文本的地方)并且您的处理步骤没有考虑到这一点帐户。

【讨论】:

  • [c,pathc]=uigetfile({'*.txt'},'选择数据','V:\data);文件=[路径 c];数据= dlmread(文件,',',1,4);以上是我的代码。无论如何要使用上面使用的代码,因此如果在文件中间的字符串中写入一行,它不会停止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2012-04-27
相关资源
最近更新 更多