2016-07-28 20 views
0

Ich habe eine Matlab-Tabelle und möchte eine SQL INSERT-Anweisung dieser Zeile (n) erstellen.Wie matlab Tabelle konvertieren [Inf], '' Eintrag in Zeichenkette

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 wenn 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: die [Inf] Eintrag
  2. Problem: vielleicht [123] Anzahl Einträge
  3. Problem: '' Einträge

Zusätzlich sind folgende Befehle in dieser auch nutzlos Sache:

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

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

Ziel Statement wäre so etwas wie dieses:

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

ist der Inf-Eintrag in einem Vektor enthalten? Hast du mat2str ausprobiert? – stmfunk

+0

gibt mir: Fehler bei der Verwendung von mat2str (Zeile 55) Eingabematrix muss numerisch sein. –

+0

was ist 'str2double' – GameOfThrows

Antwort

0

der Ordnung halber: num2str (cell2mat (conditionTable.Data)) arbeitet, unabhängig sein, wenn 'abc', [Inf], [0], [123,123] offenbar, ..

1

Ja, num2str eine einzelne Variable jeglicher Art akzeptieren und einen String zurückgeben, so dass alle diese Operationen sind gültig:

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

er kann jedoch mit rein numerischen arra beschäftigen ys (z.B. num2str([5 456]) ist auch gültig), aber es wird bombardiert, wenn Sie versuchen, ein Zellenarray darauf zu werfen (auch wenn alle Ihre Zellen numerisch sind).


Es gibt 2 möglichen Weg, um das zu arbeiten, um alle Ihre Werte Zeichen-Arrays zu konvertieren:

1) verwenden, um ein Zwischenzellenfeld
ich eine Tabelle neu erstellt [T] mit dem gleichen Daten als in Ihrem Beispiel. Dann läuft:

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

erzeugt eine neue Tabelle, die nur Zeichenfolgen enthält. Beachten Sie, dass wir die Spaltennamen (kopiert aus der ursprünglichen Tabelle) neu erstellen mussten, da diese bei der Konvertierung nicht in das Zellenfeld übertragen werden. Diese Methode eignet sich für relativ kleine Tabellen, da die Rundreisetabelle/Kellerplatz/Tisch plus der Anruf zu cellfun wahrscheinlich für größere Tabellen ziemlich langsam sind.


2) Verwenden varfun Funktion

varfun für Tabellen ist das Äquivalent von cellfun für Zellenanordnungen. Sie würden denken, dass eine einfache

würde die Arbeit dann tun ... nun nein. Dies wird auch Fehler.Wenn Sie sich den Code varfun an der durch den Fehler angezeigten Zeile ansehen, werden Sie feststellen, dass Daten in Ihrer Tabelle intern in Zellenarrays konvertiert werden und die Funktion darauf angewendet wird. Wie wir oben gesehen haben, num2str Fehler beim Treffen mit einem Zell-Array. Der Trick, um das zu überwinden, besteht darin, eine angepasste Version von num2str zu senden, die Zellenarrays akzeptiert. Zum Beispiel:

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

Bewaffnet mit, dass, können Sie es jetzt benutzen, um Ihre Tabelle zu konvertieren:

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

Dies wird die gleiche Tabelle als im obigen Beispiel 1 herzustellen. Beachten Sie, dass wir die Spaltenüberschriften erneut der neu erstellten Tabelle zuweisen mussten (). Die Ironie ist varfun erstickt, wenn versucht wird, die Funktion auf die Spaltenüberschriften anzuwenden, aber nicht erneut verwendet oder in der Ausgabe zurückgegeben wird ... go figure.)


Diskussion: Am Anfang habe ich versucht, die varfun Lösung Arbeit (daher der Name T2 des Ergebnisses) zu machen, und wollte diese empfehlen, weil ich nicht die Tabelle/Zelle/Tabellenumwandlung gefallen hat, der anderen Lösung. Jetzt habe ich gesehen, was in varfun geht, ich bin mir nicht so sicher, dass diese Lösung schneller sein wird. Es könnte etwas semantischer lesbar sein, aber wenn Geschwindigkeit ein Problem ist, müssen Sie beide Version versuchen und wählen, welche Ihnen die besten Ergebnisse gibt.