如何使用混合类型遍历八度的xlsx数据

时间:2018-07-03 10:46:43

标签: octave

我正在尝试使用八度的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数据的每个单元格?

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

1 个答案:

答案 0 :(得分:1)

数字数组不能包含多类数据,因此cell2mat失败。单元格数组用于保存此类数据,并且您已经将其存储在单元格数组中,因此无需转换,因此只需跳过该行(allData = cell2mat(RAW);)。< / p>

在循环中,您具有以下这一行:

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

问题由向上箭头表示。

  1. 您已经在单元格数组中混合了数据,但是您正在使用%d作为数据说明符。您可以通过将所有数据转换为字符串然后使用%作为说明符来解决此问题。
  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
}