如何使用混合类型循环访问八度字节的 XLSX 数据



我正在尝试读取一个简单的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

问题由向上箭头表示。

  1. 您已在单元格数组中混合了数据,但%d用作数据说明符。您可以通过将所有数据转换为字符串,然后使用%s 作为说明符来解决此问题。
  2. 如果使用方括号( )为单元格数组编制索引,则会得到一个单元格。您在这里需要的是用于该单元格{ }大括号的内容。

所以它将是:

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
}

最新更新