我正在尝试使用八度的xlsread读取一个简单的xlsx文件。其csv版本如下所示:
2,4,abc,6
8,10,pqr,12
14,16,xyz,18
我正在尝试使用以下代码读取和写入内容:
[~, ~, RAW] = xlsread('file.xlsx');
allData = cell2mat(RAW); # error with cell2mat()
printf('data nrows=%d, ncolms=%d\n', rows(allData), columns(allData));
for i=1:rows(allData)
for j=1:columns(allData)
printf('data(%d,%d) = %d\n', i,j, allData(i,j));
endfor
endfor
我收到以下错误:
error: cell2mat: wrong type elements or mixed cells, structs, and matrices
我已经尝试了此问题的几种变体:
(A)如果我删除带有文本数据的列,即xlsx文件仅包含数字,则此代码可以正常工作。
(B)另一方面,如果我甚至删除纯数字xlsx的cell2mat()调用,在访问单元格时也会出错:
error: printf: wrong type argument 'cell'
(C)如果在printf期间使用cell2mat(),如下所示:
printf('data(%d,%d) = %d\n', i,j, cell2mat(allData(i,j)));
我得到正确的整数数据,并得到文本项的垃圾数据。
那么,当xlsx包含混合类型的数据时,如何访问和打印xlsx数据的每个单元格?
换句话说,给定列索引,并且知道我在那里期望的数据类型(整数或字符串),那么在使用它之前如何重新格式化单元格类型?
答案 0 :(得分:1)
数字数组不能包含多类数据,因此cell2mat
失败。单元格数组用于保存此类数据,并且您已经将其存储在单元格数组中,因此无需转换,因此只需跳过该行(allData = cell2mat(RAW);
)。< / p>
在循环中,您具有以下这一行:
printf('data(%d,%d) = %d\n', i, j, allData(i,j) );
% ↑ ↑ ↑
% 1 2a 2b
问题由向上箭头表示。
%d
作为数据说明符。您可以通过将所有数据转换为字符串然后使用%
作为说明符来解决此问题。( )
来索引单元格数组,则会得到一个单元格。您需要的是该单元格的内容,并使用大括号{ }
。它将是:
printf('data(%d,%d) = %s\n', i,j, num2str(RAW{i,j}));
请注意,除了全部内容,您只需输入RAW
即可获取此信息:
octave:1> RAW
RAW =
{
[1,1] = 2
[2,1] = 8
[3,1] = 14
[1,2] = 4
[2,2] = 10
[3,2] = 16
[1,3] = abc
[2,3] = pqr
[3,3] = xyz
[1,4] = 6
[2,4] = 12
[3,4] = 18
}