2012-10-10 106 views
4

我有一個程序從傳感器收集數據,並將其保存到文本文件中。該數據n文本文件看起來像這樣:matlab - 反序列化數組

 
[1,2,3,4] 
[5,6,7,8] 
[9L,10L,11L,12L] 

我怎麼反序列化陣列到MATLAB引導?

note我有一些數組與float值,所以請認爲也讀取浮動。

+0

第三排'L'是怎麼回事? –

+0

@GuntherStruyf這意味着它的類型的'long' – elyashiv

回答

3

不幸的是我沒有找到任何清潔劑解決這個 - 這個問題的,當然在每行的開頭和結尾的括號內。這裏有一個解決方案,它可以逐行讀取文件,並在切出括號的字符串上運行textscan。各個矢量被存儲在cell

fid = fopen('data.txt', 'r'); 
data = {}; 
while 1 
    tline = fgetl(fid); 
    if ~ischar(tline); break; end 
    A = textscan(tline, '%f', 'Delimiter', ',', 'Whitespace', '[ ]L\b\t'); 
    data{end+1} = A{1}; 
end 
fclose(fid); 

L在這裏視爲分隔符。如果這些信息對您而言非常重要,並且您想要對uint64進行類型轉換,則上面的代碼將不得不進行修改。

編輯繼H.Muster的評論,你可以一氣呵成讀取整個文件,如下所示:

fid = fopen('data.txt', 'r'); 
A = textscan(fid, '%f', 'Delimiter', ',', 'Whitespace', '[ ]L\b\t'); 
fclose(fid); 

現在A包含所有數據的單個列向量。所以如果你知道每一行的矢量大小,你可以把A分成正確大小的塊。如果沒有,並且每個載體可以具有不同的大小,則必須使用第一種解決方案。

+0

爲什麼你不聲明括號空白:加入'「空白」,「[,]」'的'textscan'選擇? –

+0

@ H.Muster好點。然而,問題依然存在 - 一次調用'textscan'將會把所有的向量讀入一個數組中。所以我無論如何都必須在循環中做...我已經更新了我的答案。 – angainor

+0

不錯的更新! (+1) –

3

只是一個小除了 - 一旦你刪除了「L」的數據是有效的MATLAB代碼。你可以把它讀出來:

text_data = '[1,2,3,4]'; 
parsed_data = eval(text_data);