在Matlab中迭代逗号分隔的列表会给出错误:“FORexpression式逗号分隔的列表必须只有一个项目”。

我试图通过摆脱一些文本中的不必要的垃圾来清理一些文本数据。 该文本当前存在于Excel数据集中,全部在一列中,每个“项目”文本占据一行。 这些项目都是string,每个字符都有几个到几个字。 我使用下面的代码(第二块)提取项目,它给了我list1,这是一个14510×1单元格。

我想在Matlab中运行这个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 

我从Excel表中得到了“list1”,如下所示:

 [~,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试图找出一个解决scheme,到目前为止,我什么都没有find。 我尝试了转置list1,它仍然没有工作。 此外,当我打电话像list1 {1}等,它总是正常工作,并返回整个string。 我对Matlab很新,所以答案可能很简单! 如果我留下了一些有用的信息,请让我知道。 我感谢任何帮助。 谢谢!

给定一个单元格c, c{1:2}的输出生成一个逗号分隔的列表,等同于c{1},c{2} 。 如果您将该显式逗号分隔列表replace成

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