在Matlab中迭代逗号分隔列表会产生错误:" FOR表达式逗号分隔列表必须只有一个项目。"

时间:2017-04-23 17:35:44

标签: arrays regex excel matlab

我试图通过删除某些文本中不必要的垃圾来清理一些文本数据。该文本当前存在于Excel数据集中,全部在一列中,每个"项目"文本占据每行一行。这些项目都是字符串,每个字符串中包含几个到多个单词。我使用下面的代码(第二个块)提取了项目,它给了我list1,这是一个14510x1的单元格。

我试图在Matlab中运行for for循环:

function list2 = cleanup(exp_spec,list1)
for i = list1{(1:length(list1))};
        str = i;
        replace = '';
        list2{i} = regexprep(str,exp_spec,replace);
    end
end

我得到了" list1"来自excel表,如下:

[~,txt,~] = xlsread('spreadsheet.xlsx','T:T');
    list1 = txt;

当我尝试使用此行运行代码时,

list2 = cleanup('&#[0-9]+;',list1);
clean_list = list2;

它会抛出错误:

FOR expression comma separated list must have exactly one
item.

    Error in cleanup (line 2)
    for i = list1{(1:length(list1))};

    Error in project_main (line 57)
        list2 = cleanup('&#[0-9]+;',list1);

我一直在寻找HOURS试图找到解决方案,到目前为止我一无所获。我试过转换list1但它仍然无法正常工作。此外,当我调用类似list1 {1}等的东西时,它总是正常工作并返回整个字符串。我对Matlab很陌生,所以答案可能非常简单!如果我留下了有用的东西,请告诉我。我感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

给定一个单元格c,c{1:2}的输出产生一个等同于c{1},c{2}的逗号分隔列表。如果将该明确的逗号分隔列表替换为

for i=c{1:2}

你得到了

for i=c{1},c{2}

这不是合法语法,因此您会收到错误消息。

我认为迭代索引本身会更直接,如下所示:

function list2 = cleanup(exp_spec,list1)
    replace = '';
    for i = 1:length(list1)
        list2{i} = regexprep(list1{i},exp_spec,replace);
    end
end

执行此操作的高级方法是使用cellfun和匿名函数:

l2 = cellfun(@(str)regexprep(str,exp_spec,replace), ...
     l1, 'UniformOutput', false);