0

メッセージとタイムスタンプを含むテキスト ファイルがあります。

 {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) 

これは部分的に機能しますが、異なるメッセージ タイプ (フィールド数など) を区別するのに問題があります。sortデータを適切に配列に入れることができれば、matlab関数を使用できると思います。

matlabでこれを行う方法はありますか?

4

2 に答える 2

1

動作するはずのいくつかの手順を次に示します。

0: 各行のフィールド数の上限を見つける

1: きれいな長方形のデータがあることを確認してください。各行に存在するコンマの数から{括弧の数を引いたものを見てください。(を差し引かないでください。そうしないと、}ダブルをカウントすることになります)。これにより、フィールドの数が得られます。次に、各行が最大になるまでコンマを追加します。

2: { andを次}のような標準のテキスト インジケーターに変更します。"

3: などを使用して結果をインポートしxlsread()ます。

于 2012-11-15T17:12:18.157 に答える
1

デニスは、複数のブレースのセットなどがあるため、おそらく前処理を行う必要があると言っています。

あなたが探しているのは、基本的にファイルの行をソートする何らかの方法です。個々の文字列フィールドをキャプチャすることを気にせず、行を並べ替えるだけであれば、数値であることがわかっている最初のフィールドに従って読み取りと並べ替えを行うことができます。これはかなりハックですが、次のようなものを探しているかもしれません (これは本質的に、上記のコメントでデニスが示唆しているものです):

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)

于 2012-11-15T17:34:22.797 に答える