0

我希望makeValidName在以下数据上使用该函数:

Id  Val Random          Desc
a   1.1 0.036835624 Bread Cheese
b   2.2 0.020442492 Fish Bread
c   -3.3    0.020050676 Cheese Fish
d   #N/A    0.017619332 Bread Cheese
e   -5.4    0.014973153 Fish Bread
f   6.6 0.014648887 Cheese Fish
g   -7.6    0.014071844 Bread Cheese
h   8   0.014013118 Fish Bread

但是,当我导入表(使用 readtable 从 xlsx 读取)时,它看起来像这样:

输入数据 =

 Id             Val              Random          Desc     
____    ____________________    ________    ______________

'a '    '1.1'                   0.036836    'Bread Cheese'
'b'     '2.2'                   0.020442    'Fish Bread'  
'c'     '-3.3'                  0.020051    'Cheese Fish' 
'd'     'ActiveX VT_ERROR: '    0.017619    'Bread Cheese'
'e'     '-5.4'                  0.014973    'Fish Bread'  
'f'     '6.6'                   0.014649    'Cheese Fish' 
'g'     '-7.6'                  0.014072    'Bread Cheese'
'h'     '8'                     0.014013    'Fish Bread'  

如何防止它将条目Val从数字转换为字符串?这使得它无法使用makeValidName。我需要makeValidName跨所有行和列应用,因为表非常大,单独命名适当的列是不可行的。那么实现这一目标的最优雅的方式是什么?

当前代码:

varnames = inputData.Properties.VariableNames;
for ii = 1:length(varnames)

inputData.(varnames{ii})= matlab.lang.makeValidName(inputData.(varnames{ii}));

end

产生错误:

使用 matlab.lang.makeValidName 时出错(第 72 行)第一个输入必须是字符串或字符串向量元胞数组。

并在列中产生不良结果,例如Val

输入数据 =

Id            Val             Random         Desc     
___    __________________    ________    _____________

'a'    'x1_1'                0.036836    'BreadCheese'
'b'    'x2_2'                0.020442    'FishBread'  
'c'    'x_3_3'               0.020051    'CheeseFish' 
'd'    'ActiveXVT_ERROR_'    0.017619    'BreadCheese'
'e'    'x_5_4'               0.014973    'FishBread'  
'f'    'x6_6'                0.014649    'CheeseFish' 
'g'    'x_7_6'               0.014072    'BreadCheese'
'h'    'x8'                  0.014013    'FishBread'
4

1 回答 1

1

因为在中间使用 Excel 似乎更让人头疼。我建议使用basic可以减轻一些解析错误的模式。

文档中

basic模式是没有 Excel for Windows 的系统的默认设置。在 basic模式下,readtable

  • 仅读取 XLS、XLSX、XLSM、XLTX 和 XLTM 文件。
  • 'Range'读取 XLS 文件时不支持名称-值对参数。
  • 将所有日期作为 Excel 序列日期编号导入。Excel 序列日期编号使用与 MATLAB® 日期编号不同的参考日期。

这允许我们使用TreatAsEmpty名称-值对参数,因为它将正确解析数字列。

inputData = readtable('test.xlsx', 'Basic', 1, 'TreatAsEmpty', '#N/A');

示例案例返回:

inputData = 

    Id     Val      Random          Desc     
    ___    ____    ________    ______________

    'a'     1.1    0.036836    'Bread Cheese'
    'b'     2.2    0.020442    'Fish Bread'  
    'c'    -3.3    0.020051    'Cheese Fish' 
    'd'     NaN    0.017619    'Bread Cheese'
    'e'    -5.4    0.014973    'Fish Bread'  
    'f'     6.6    0.014649    'Cheese Fish' 
    'g'    -7.6    0.014072    'Bread Cheese'
    'h'       8    0.014013    'Fish Bread'

从理论上讲,这应该意味着数字数据列是double数组,而字符串保留在cell数组中。因此,要使用matlab.lang.makeValidName您可以测试每一列,iscell看看它是否是一个单元格数组:

varnames = inputData.Properties.VariableNames;
for ii = 1:length(varnames)
    if iscell(inputData.(varnames{ii}))
        % If they're strings they're in a cell array
        inputData.(varnames{ii})= matlab.lang.makeValidName(inputData.(varnames{ii}));
    end
end

返回:

inputData = 

    Id     Val      Random         Desc     
    ___    ____    ________    _____________

    'a'     1.1    0.036836    'BreadCheese'
    'b'     2.2    0.020442    'FishBread'  
    'c'    -3.3    0.020051    'CheeseFish' 
    'd'     NaN    0.017619    'BreadCheese'
    'e'    -5.4    0.014973    'FishBread'  
    'f'     6.6    0.014649    'CheeseFish' 
    'g'    -7.6    0.014072    'BreadCheese'
    'h'       8    0.014013    'FishBread'  
于 2015-12-09T13:41:27.313 回答