2013-11-15 90 views
0

我是編程方面的新手,我一直在試圖解決這個問題。使用列表重命名數據集

我想拉大約300個MySQL表到Matlab到我的工作區。

我附加了下面的代碼,它被設計用來拉一個表(我打算在它工作時通過300個mysql表來循環這段代碼)。

代碼成功地將單個表格導入工作空間作爲新的數據集。

我嘗試用原始mysql表的名稱重命名這個新數據集時出現問題。

請參見下面的代碼對於這部分,我搞砸了(%分配數據輸出變量)

我所有的300個表的名單,我打算將它們存儲在一個名爲列表'name'...因此,名字(1)...這是正確的方法嗎?

例如,原始的mysql表稱爲'options_20020208'。

運行腳本之後,我需要Matlab導入的新數據集也稱爲'options_20020208'。

這裏的任何想法?

%Define Query 

name = 'options_20020208' 




%Set preferences with setdbprefs. 
setdbprefs('DataReturnFormat', 'dataset'); 
setdbprefs('NullNumberRead', 'NaN'); 
setdbprefs('NullStringRead', 'null'); 


%Make connection to database. 
conn = database('', 'root', 'password', 'Vendor', 'MYSQL', 'Server', 'localhost', 'PortNumber', 3306); 


%Read data from database. 
curs = exec(conn, [['SELECT ',name,'.UnderlyingSymbol , ']... 
, [name,'.UnderlyingPrice , ']... 
, [name,'.Expiration , ']... 
, ['FROM ','PriceMatrix.',name,' ']... 
]); 

curs = fetch(curs); 

close(curs); 

%Assign data to output variable 
name(1) = curs.Data; 

%Close database connection. 
close(conn); 

%Clear variables 
clear curs conn 

回答

0

如果已經定義了一個可變namename(1)手段「的變量名的第一個元素」(在這種情況下只是「O」)。無論變量的大小如何,它都會返回一個值(即使X是某個5-D monstrosity,X(50)只返回第50個元素的值)。 name(1) = data表示「將變量name的第一個元素設置爲等於data」,並且如果數據的大小不正確,將導致錯誤;如果數據的類型不正確,則會導致錯誤或意外行爲。

例如,嘗試這種在命令行:

name = 'options_20020208'; 
name(1) = 1 

現在,在技術上你想要什麼都可以做,但我不建議這樣做。如果你有某種形式的300×(長度)變量所有的名字,然後在n的循環= 1:300這將是這樣的(其中name是你的變量名的列表):

eval([name(n,:) ' = curs.Data;']) 

這將返回300個名爲'options_20020208'的變量或類似的變量,每個變量包含一組curs.Data。不過,也有存儲在您的工作空間數據,這將使你的數據更易於進一步操作的更好的方式,例如,你可以使用結構:

myStruct(n).name = name(n,:); 
myStruct(n).Data = curs.Data; 

如果你想要做一些分析,然後保存了所有數據例如,在一些格式中,循環結構將變得更容易,並且將文件名設置爲[myStruct(n).name,'.csv']並將文件內容設置爲mystruct(n).AdjustedData等,然後處理300個命名變量。

+0

謝謝NKJT, 這有助於噸。 你剛剛救了我幾個小時的挫折! – BenTam64