2012-11-15 23 views
0

我有一個包含消息和時間戳的文本文件:如何在Matlab中將具有不同數量的數據條目的行從文本文件讀入數組?

{193220,message,ucontroller9,controller1,lowalarm,success}, 
{193220,message,controller1,changer,{change,down},success}, 
{193220,controlaction,tapchange_down,{oldsetting,0.975},{newsetting,0.95}}, 
{193220,modelupdate_start,changeup,changer,193220}, 
{14430,modelupdate_complete}, 
{278480,message,ucontroller6,controller1,highalarm,success}, 
{278480,message,controller1,changer,{change,up},success}, 
... 

我想這些行讀入的陣列和重新排序基於第一列中的陣列。到目前爲止我的做法如下:

fid = fopen('messagestore.txt') % Open file 
n=1  
while 1 
string = fgetl(fid);    % get line 
if ~ischar(string), break, end  % break if end of file 
string = strrep(string,'[',''); % 
string = strrep(string,']',''); % 
string = strrep(string,'{',''); % strip out unwanted characters 
string = strrep(string,'}',''); % 
string = strrep(string,',',' '); % 
string = string(2:end);   % remove space at start 

MessageArray(:,n) = textscan(string,'%f%s%s%s%s%s'); % format and save into array 
n=n+1; 
end 
fclose(fid) 

這部分工作,但我有區分不同的消息類型(即字段數量)的問題。我猜我可以使用matlab sort函數,如果我可以正確地獲取數據到一個數組。

有沒有辦法在matlab中做到這一點?

+0

如果你只需要命令他們執行,你實際上並不需要解析整個字符串,並且可以在第一場後只停留。 –

回答

1

丹尼斯說得對,你可能應該做一些預處理,因爲你有多套花括號等等。

您可能正在尋找的是一些基本上對文件行進行排序的方法。如果你不擔心捕獲單個字符串字段,但只是在重新排序線,你可以閱讀和排序根據第一場,你知道是數字。這是漂亮的hackish,但也許你正在尋找的東西像(實際上,這就是丹尼斯暗示在上面的註釋):

clear all, clc 
fid = fopen('messagestore.txt'); 
n=1; 
nums = []; 
while 1 
    string = fgetl(fid);    % get line 
    if ~ischar(string), break, end  % break if end of file 

    for k = 1:length(string) 
     if string(k) == ',' 
      break 
     end 
    end 
    nums = [nums str2num(string(2:k-1))]; 
    MessageArray{n} = string; 
    n=n+1; 
end 
[nums,I] = sort(nums); 
MessageArray = MessageArray(I); 
fclose(fid); 

% Print some output 
for k = 1:length(nums) 
    disp(MessageArray{k}) 
end 

產生

{14430,modelupdate_complete}, 
{193220,message,ucontroller9,controller1,lowalarm,success}, 
{193220,message,controller1,changer,{change,down},success}, 
{193220,controlaction,tapchange_down,{oldsetting,0.975},{newsetting,0.95}}, 
{193220,modelupdate_start,changeup,changer,193220}, 
{278480,message,ucontroller6,controller1,highalarm,success}, 
{278480,message,controller1,changer,{change,up},success} 

現在,我不能完全肯定你的時間戳是如何工作的,在這裏我按照字面排列數值。但是你應該能夠從代碼中獲得基本的想法 - 從第一個字段中讀取數字到矢量中,然後使用該矢量對它們自己進行排序。排序您的時間戳的任何類型的要求可以通過改變[nums,I] = sort(nums)

1

這裏有一些步驟,應該工作:

0:查找字段數的上限中的每​​一行

1:請確保您有很好的矩形數據。查看每行中逗號的數量減去括號內的{的數量。 (不要扣除},否則你將計數雙打)。這給你你有多少個字段。然後添加逗號,直到每條線達到最大值。

2:更改{}到標準文本指示器等"

3:導入使用xlsread()或類似的結果。

+0

如果您的數據集包含討厭的結構,如{不屬於分隔符,或者在文件「時,您將需要通過替換他們做一些聰明的預處理 –

相關問題