0

我有一个 Matlab 表,并且想要创建此行的 SQL INSERT 语句。

K>> obj.ConditionTable

obj.ConditionTable = 

      Name              Data            Category         Description
________________    ____________    _________________    ___________

'Layout'            'STR'           ''                   ''         
'Radius'            [       Inf]    'Radius_2000_inf'    ''         
'aq'                [         0]    '0'                  ''         
'VehicleSpeed'      [       200]    'Speed_160_230'      ''         

当条件表 = obj.ConditionTable(1,:); 时出错

K>> char(conditionTable.Data)
Error using char
Cell elements must be character arrays.

K>> char(conditionTable.Description)    
ans =    
   Empty matrix: 1-by-0
  1. 问题:[Inf] 条目
  2. 问题:可能是 [123] 个条目
  3. 问题:''条目

此外,以下命令在此问题上也无用:

K>> length(conditionTable.Data)    
ans =    
     1

K>> isempty(conditionTable.Description)    
ans =    
     0

目标声明将是这样的:

INSERT INTO `ConditionTable` (`Name`, `Data`, `Category`, `Description`, `etfmiso_id`) VALUES ("Layout", "STR", "", "", 618);
4

2 回答 2

1

是的,num2str接受任何类型的单个变量并将返回一个字符串,因此所有这些操作都是有效的:

>> num2str('123')
ans =
123
>> num2str('chop')
ans =
chop
>> num2str(Inf)
ans =
Inf

但是,它可以处理纯数字数组(例如num2str([5 456])也是有效的),但是如果您尝试向其扔单元格数组(即使您的所有单元格都是数字的),它也会崩溃。


有两种可能的方法可以解决这个问题,将所有值转换为字符数组:

1)使用中间单元格数组
我重新创建了一个表[ T],其数据与您的示例中相同。然后运行:

%% Intermediate Cell array
T3 = cell2table( cellfun( @num2str , table2cell(T) , 'uni',0) ) ;
T3.Properties.VariableNames = T.Properties.VariableNames 
T3 = 
         Name         Data         Category         Description
    ______________    _____    _________________    ___________
    'Layout'          'STR'    ''                   ''         
    'Radius'          'Inf'    'Radius_2000_inf'    ''         
    'aq'              '0'      '0'                  ''         
    'VehicleSpeed'    '200'    'Speed_160_230'      '' 

生成一个只包含字符串的新表。请注意,我们必须重新创建列名称(从初始表中复制),因为在转换期间这些名称不会传输到元胞数组中。这些方法适用于相对较小的表格,因为往返 table/cellarray/table 加上cellfun对较大表格的调用可能会很慢。


2) 使用varfun功能

varfun是表等效cellfun于单元格数组。你会认为一个简单的

T2 = varfun( @num2str , T )

然后会做这项工作......好吧,不。这也会出错。如果您查看varfun错误指示的行中的代码,您会注意到在内部,表中的数据被转换为元胞数组,并且该函数应用于该行。正如我们在上面看到的,num2str遇到元胞数组时会出错。克服这个问题的诀窍是发送一个自定义版本,num2str该版本将接受元胞数组。例如:

cellnum2str = @(x) cellfun(@num2str,x,'uni',0)

有了它,您现在可以使用它来转换您的表格:

%% Use "varfun"
cellnum2str = @(x) cellfun(@num2str,x,'uni',0) ;
T2 = varfun( cellnum2str , T ) ;
T2.Properties.VariableNames = T.Properties.VariableNames ;

这将生成与上述示例 1 相同的表。请注意,我们必须再次在新创建的表上重新分配列标题(具有讽刺意味的是,varfun试图在列标题上应用函数,但没有在输出中重用或返回它们……看图。


讨论:最初我试图使varfun解决方案工作(因此T2结果的名称),并想推荐这个,因为我不喜欢其他解决方案的表格/单元格/表格转换。现在我已经看到了varfun,我不太确定这个解决方案会更快。它在语义上可能更具可读性,但如果速度是一个问题,您将不得不尝试这两个版本并选择哪个版本给您最好的结果。

于 2016-07-28T12:25:18.707 回答
0

备案:num2str(cell2mat(conditionTable.Data)),作品,独立如果'abc',[Inf],[0],[123.123],显然..

于 2016-07-28T11:07:41.983 回答