【问题标题】:MATLAB cell to stringMATLAB 单元格到字符串
【发布时间】:2021-01-02 13:57:01
【问题描述】:

我正在尝试读取 Excel 表,然后通过在字符串中查找两个“/”来查找不为空且包含日期信息的单元格 但是matlab在处理单元格类型时不断出错 “未定义运算符 '~=' 用于 'cell' 类型的输入参数。” “'cell'类型的输入参数的未定义函数'string'。” “'cell' 类型的输入参数的未定义函数 'char'。”

MyFolderInfo = dir('C:\');  

filename = 'Export.xls';
[num,txt,raw] = xlsread(filename,'A1:G200'); 

for i = 1:length(txt)
    if ~isnan(raw(i,1))
        if sum(ismember(char(raw(i,1)),'/')) == 2 
            A(i,1) = raw(i,1);
        end
    end
end

请帮忙修复一下

【问题讨论】:

    标签: excel matlab casting cell


    【解决方案1】:

    您的代码存在多个问题。由于raw 是一个元胞数组,你不能在上面运行isnanisnan 是用于数值数组。由于您只对包含文本的单元格感兴趣,因此您根本不需要使用rawtxt 中不会出现任何空白单元格。

    我的方法是创建一个逻辑数组has_2_slashes,然后使用它从raw 中提取包含两个斜线的元素。

    这是我的代码。我将它概括为读取多列,因为您的原始代码似乎只用于处理一列。

    filename = 'Export.xls';
    [~, ~, raw] = xlsread(filename, 'A1:G200'); 
    
    [num_rows, num_cols] = size(raw);
    has_2_slashes = false(num_rows, num_cols);
    for row = 1:num_rows
       for col = 1:num_cols
          has_2_slashes(row, col) = sum(ismember(raw{row, col}, '/')) == 2;
       end
    end
    
    A = raw(has_2_slashes);
    

    【讨论】:

    • 问题是我确实想在只过滤带有日期的行之后使用数字数据,但是使用这种方法,数据在 num 和 txt 矩阵之间移动,因此我试图使用原始数据
    • 我修改了我的代码以使用原始数据,而不仅仅是文本数据。事实证明,ismember 既可以处理数字数据,也可以处理字符数据,因此变化非常小。
    【解决方案2】:
    cellfun(@numel,strfind(txt,'/'))
    

    应该给你一个数字数组,其中第 (i,j) 个元素包含斜杠的数量。例如,

    >> cellfun(@numel,strfind({'a','b';'/','/abc/'},'/'))
    ans =
         0     0
         1     2
    

    这里的关键是使用strfind

    现在您可能想在您的问题中稍微扩展一下您打算使用txt 做什么——换句话说,更多地指定所需的输出,这总是一件好事。如果您打算阅读日期,最好提前阅读,例如使用regexpdatetime,而不是获取一个可以映射到日期位置的数组。照原样,使用ans>=2 next 会为您提供可以让您提取匹配条目的逻辑数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多