我在MATLAB中使用xlsread从excel文件中读取表格。我的目标是将Excel工作表的每一列读取为数字数组。其中一列有数字和数字+字符组合。例如,值可以是200,300A,450,500A,200A,100。这是我到目前为止:
[num, txt, raw] = xlsread(fileIn, sheets{ii}); % Reading in each sheet from a for loop
myCol = raw(:, 4) % I want all rows of column 4
for kk=1:numel(myCol)
if iscellstr(myCol(kk))
myCol(kk) = (cellfun(@(x)strrep(x, 'A', ''), myCol(kk), 'UniformOutput', false));
end
end
myCol = cell2mat(myCol);
这可以从数字中删除字符,但是我留下了
myCol =
[200]
'300'
[450]
'500'
'200'
[100]
在cell2mat上出错:
cell2mat(myCol)
???使用==>时出错cell2mat at 46
输入单元格数组的所有内容必须具有相同的数据类型。
我觉得我可能在某处混淆了()和{}。有人可以帮我解决这个问题吗?
答案 0 :(得分:7)
让我从阅读文件开始
[num, txt, raw] = xlsread('test.xlsx');
myCol = raw(:, 4);
idx = cellfun(@ischar,myCol ); %# find strings
data = zeros(size(myCol)); %# preallocate matrix for numeric data
data(~idx) = cell2mat(myCol(~idx)); %# convert numeric data
data(idx) = str2double(regexprep(myCol(idx),'\D','')); %# remove non-digits and convert to numeric
答案 1 :(得分:2)
变量myCol
最初是一个包含数字和字符串的单元格数组,在您的示例中如下所示:
myCol = {200; '300A'; 450; '500A'; '200A'; 100};
将字符串条目转换为数值时必须遵循的步骤是:
标识myCol
中字符串的单元格条目。您可以使用循环来执行此操作,如您的示例所示,或者您可以使用函数CELLFUN来获取logical index,如下所示:
index = cellfun(@ischar,myCol);
删除字母。如果你知道要删除的字母总是'A'
,就像在你的例子中一样,你可以在所有索引单元格上使用像STRREP这样的简单函数,如下所示:
strrep(myCol(index),'A','')
如果您可以在字符串中包含各种其他字符和字母,那么像REGEXPREP这样的函数可能会更适合您。对于您的示例,您可以这样做:
regexprep(myCol(index),'\D','')
将数字字符串转换为数字值。您可以使用函数STR2DOUBLE:
为所有索引单元格执行此操作str2double(regexprep(myCol(index),'\D',''))
然后,上述的最终结果可以与myCol
中的原始数值组合。总而言之,您将获得以下内容:
>> index = cellfun(@ischar,myCol);
>> result(index,1) = str2double(regexprep(myCol(index),'\D',''));
>> result(~index) = [myCol{~index}]
result =
200
300
450
500
200
100