如何使用混合类型在八度音程中迭代 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
问题用向上箭头表示。
- 您在元胞数组中混合了数据,但您使用
%d
作为数据说明符。您可以通过将所有数据转换为字符串然后使用 %
s 作为说明符来解决此问题。
- 如果您使用方括号
( )
对元胞数组进行索引,您将得到一个元胞。您在这里需要的是该单元格的内容,大括号 { }
用于此。
所以它将是:
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
}
我正在尝试使用八度 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
问题用向上箭头表示。
- 您在元胞数组中混合了数据,但您使用
%d
作为数据说明符。您可以通过将所有数据转换为字符串然后使用%
s 作为说明符来解决此问题。 - 如果您使用方括号
( )
对元胞数组进行索引,您将得到一个元胞。您在这里需要的是该单元格的内容,大括号{ }
用于此。
所以它将是:
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
}