代码之家  ›  专栏  ›  技术社区  ›  R71

如何在混合类型的倍频程中迭代xlsx数据

  •  0
  • R71  · 技术社区  · 7 年前

    我正在尝试读取一个简单的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=%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)如果在打印时使用cell2mat(),则如下所示:

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

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

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Sardar Usama    7 年前

    数字数组不能有多类数据,因此 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
    }