如何使用混合类型在八度音程中迭代 xlsx 数据

how to iterate over xlsx data in octave with mixed types

我正在尝试使用八度 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) 另一方面,如果我删除 cell2mat() 调用,即使是纯数字 xlsx,我在单元格访问期间也会出错:

error: printf: wrong type argument 'cell'

(C) 如果我在 printf 期间使用 cell2mat(),像这样:

printf('data(%d,%d) = %d\n', i,j, cell2mat(allData(i,j)));

我得到的整数数据是正确的,文本项是垃圾数据。

那么,当 xlsx 包含混合类型数据时,我如何访问和打印 xlsx 数据的每个单元格?

换句话说,给定一个列索引,并且我知道我期望那里的数据类型(整数或字符串),那么如何在使用它之前重新格式化单元格类型?

数值数组不能包含多个 class 数据,因此 cell2mat 失败。元胞数组用于保存此类数据,并且您已经将其保存在元胞数组中,因此 不需要转换 因此只需跳过该行 (allData = cell2mat(RAW); ).

在循环中,你有这一行:

printf('data(%d,%d) = %d\n', i, j, allData(i,j) );
%                      ↑                  ↑   ↑ 
%                      1                 2a   2b

问题用向上箭头表示。

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

所以它将是:

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
}