2013-12-20 20 views
2

我這是前一組下方的行中附加了3個新的值的.csv文件:提取從附加.CSV最近的值MATLAB

dlmwrite('MyFile.csv', [MyValue,MyValue2,MyValue3], '-append'); 

出現這種情況的每一分鐘。它會無限期地發生,因爲它會隨着時間積累數據:

如何從文件中連續複製最近60組值,並將它們存儲在新的csv文件中,如MyFile2。 .csv文件每分鐘增加1。即在60分鐘內存儲60個值,但是我可能有100個值並且想要提取最近的60個用於另一個文件。

CSV文件的圖像 - 第二列是時間小時:分鐘而不:分離器(忽略的經過以行38和39或任何失誤之間時間別處):

enter image description here

注: MyValue每分鐘添加到文件中,因爲該腳本每60秒會從另一個腳本運行。即沒有在主腳本沒有內部定時器:

Period = 60; % Update period in seconds 

tim = timer('Period', Period, 'ExecutionMode', 'fixedRate',... 
    'TimerFcn', 'TESTINGFINAL'); 

start(tim) 

stop(tim) 

runtmp = fullfile('MyScriptLocation','MyScript'); 
run(runtmp); 

回答

1

這不是一個完整的答案,但我有一個想法,如果我理解正確。這意味着你可能想運行Matlab 24/7?或者至少不停地一段時間?如果是這樣,你可以嘗試命令clock,它顯示並存儲系統時間。在你的情況

time=clock; 其中 time(4)持有小時。因此,只要此參數更改,您應該打開.csv文件並保存最後60個值。

但是,這樣做,我認爲是高耗能。可悲的是Matlab沒有像Unix那樣的sleep命令,所以也許看一下在另一種編程語言中運行這個程序會很有趣。

請給我提意見和反饋,因爲我看到這不是一個完整的答案(還)!

+0

我編輯了我的主題以包含有關計時器在腳本上的更多信息,請看看。它實際上是通過在單獨的腳本中運行腳本來更新值。我從MyValue的Web源獲取數據(想象股票/天氣信息),以便從文件中追加時間。 – loco

2

如果你想在運行時持續這樣做,我會建議某種形式的循環緩衝區排列,所以你總是有最後60個值在內存中。這將比試圖計算連續日誌文件的當前長度更容易。基本思路(減去實際時間碼):

% initialising buffer 
MyValue1 = zeros(60,1); 

while true % for certain values of true 

% these go once a minute 
mv1 = myfunc1(inputs); 
MyValue1 = [MyValue1(2:end); mv1]; 
dlmwrite('MyFile.csv', [mv1], '-append'); 

% this goes less frequently, I presume 
filename = [datestr(now,30),'.csv']; % dynamic filename 
dlmwrite(filename, MyValue1); 

end 

這樣,你有兩個您連續記錄文件(每分鐘更新一次),以及含有什麼都在他們的時間的最後60個值一系列較小的文件書面(根據需要每小時更新一次,或在其他觸發器上更新)。

有了您的計時器,這樣做的一種方式似乎是保留了多少次收購腳本運行一個簡單的計數器,然後使用mod功能檢查時,該打的60

+0

我已經編輯了我的線程,以包含有關計時器在腳本上的更多信息。它實際上是通過在單獨的腳本中運行腳本來更新值。我會不會最好只使用文件尺寸?我怎麼能這樣做。 – loco

+0

'mv1'代表什麼? – loco

+0

嗨 - 在這個版本中,'mv1'將會是您從某個數據採集過程中獲取的單個值或者從某個函數計算出來的值--MyValue1是包含最新60個這樣的緩衝區的緩衝區。我認爲這樣做會更容易,而不是試圖解決文件維度問題,特別是隨着連續文件的增長。將編輯。 – nkjt