florian.isopp
florian.isopp

Reputation: 862

How to convert matlab table [Inf], '' entry to char string

I have a Matlab table and want to create an SQL INSERT statement of this line(s).

K>> obj.ConditionTable

obj.ConditionTable = 

      Name              Data            Category         Description
________________    ____________    _________________    ___________

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

Erros when conditionTable = 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. problem: the [Inf] entry
  2. problem: possibly [123] number entries
  3. problem: '' entries

Additionally, following commands are also useless in this matter:

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

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

Target Statement would be something like this:

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

Upvotes: 0

Views: 1291

Answers (2)

Hoki
Hoki

Reputation: 11812

Yes, num2str accept a single variable of any type and will return a string, so all these operations are valid:

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

However, it can deal with purely numeric arrays (e.g. num2str([5 456]) is also valid), but it will bomb out if you try to throw a cell array at it (even if all your cells are numeric).


There are 2 possible way to work around that to convert all your values to character arrays:

1) use an intermediate cell array
I recreated a table [T] with the same data than in your example. Then running:

%% 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'      '' 

produces a new table containing only strings. Notice that we had to recreate the column names (copied from the initial table), as these are not transferred into the cell array during conversion. These method is suitable for relatively small tables, as the round trip table/cellarray/table plus the call to cellfun will probably be quite slow for larger tables.


2) Use varfun function

varfun is for Tables the equivalent of cellfun for cell arrays. You'd think that a simple

T2 = varfun( @num2str , T )

would do the job then ... well no. This will error too. If you look at the varfun code at the line indicated by the error, you'll notice that internally, data in your table are converted to cell arrays and the function is applied to that. As we saw above, num2str errors when met with a cell array. The trick to overcome that, is to send a customised version of num2str which will accept cell arrays. For example:

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

Armed with that, you can now use it to convert your table:

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

This will produce the same table than in the example 1 above. Notice that again we had to reassign the column headers on the newly created table (the irony is varfun choked trying to apply the function on the column headers, but does not re-use or return them in the output ... go figure.)


discussion: Initially I tried to make the varfun solution work (hence the T2 name of the result), and wanted to recommend this one, because I didn't like the table/cell/table conversion of the other solution. Now I have seen what goes on into varfun, I am not so sure that this solution will be faster. It might be slightly more readable in a semantic way, but if speed is a concern you'll have to try both version and choose which one gives you the best results.

Upvotes: 1

florian.isopp
florian.isopp

Reputation: 862

for the record: num2str(cell2mat(conditionTable.Data)), works, independant if 'abc', [Inf], [0], [123.123], apparently..

Upvotes: 0

Related Questions