我正在尝试读取一个简单的xlsx文件,其中xlsread为八度。其 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=%dn', rows(allData), columns(allData));
for i=1:rows(allData)
for j=1:columns(allData)
printf('data(%d,%d) = %dn', i,j, allData(i,j));
endfor
endfor
并且我收到以下错误:
error: cell2mat: wrong type elements or mixed cells, structs, and matrices
我已经尝试了这个问题的几种变体:
(A(如果我删除带有文本数据的列,即xlsx文件仅包含数字,则此代码工作正常。
(B( 另一方面,如果我删除 cell2mat(( 调用,即使是纯数字 xlsx,我在单元格访问期间也会出错:
error: printf: wrong type argument 'cell'
(C( 如果我在 printf 中使用 cell2mat((,像这样:
printf('data(%d,%d) = %dn', i,j, cell2mat(allData(i,j)));
我得到了整数的正确数据,以及文本项的垃圾数据。
那么,当 xlsx 包含混合类型数据时,如何访问和打印 xlsx 数据的每个单元格?
换句话说,给定一个列索引,并且给定我知道我期望在那里的数据类型(整数或字符串(,那么如何在使用之前重新格式化单元格类型?
数值数组不能具有多类数据,因此cell2mat
失败。单元格数组用于保存此类数据,并且您已经将其保存在单元格数组中,因此无需转换,因此只需跳过该行(allData = cell2mat(RAW);
(。
在循环中,你有这样一行:
printf('data(%d,%d) = %dn', i, j, allData(i,j) );
% ↑ ↑ ↑
% 1 2a 2b
问题由向上箭头表示。
- 您已在单元格数组中混合了数据,但
%d
用作数据说明符。您可以通过将所有数据转换为字符串,然后使用%
s 作为说明符来解决此问题。 - 如果使用方括号
( )
为单元格数组编制索引,则会得到一个单元格。您在这里需要的是用于该单元格{ }
大括号的内容。
所以它将是:
printf('data(%d,%d) = %sn', 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
}