Main Content

カスタム ファイル リーダーを使用したデータのインポート

シミュレーション データ インスペクターでサポートされていないデータまたはファイル形式で保存されたデータを可視化する場合は、io.reader クラスを使用して、シミュレーション データ インスペクター用の独自のカスタム ファイル リーダーを記述できます。この例では、カスタム ファイル リーダーのクラス定義のいくつかの部分について説明し、シミュレーション データ インスペクターにリーダーを登録する方法を示します。ExcelFirstColumnTimeReader.m ファイルを開いて、完全なクラス定義を表示します。

カスタム リーダーのクラス定義の記述

カスタム リーダーでカスタム形式を使用するファイルや変数から関連のデータとメタデータを抽出する方法を指定するクラス定義を記述します。MATLAB™ パス上の場所にクラス定義ファイルを保存します。

この例のカスタム リーダーは、関数 readtable を使用して Microsoft Excel™ ファイルからデータを読み込み、ファイルの最初の列を時間データとして使用します。

クラス定義は、io.reader クラスからの継承で始まり、その後に必要な関連データとメタデータを返すメソッド定義が続きます。

classdef ExcelFirstColumnTimeReader < io.reader

すべてのカスタム リーダーは getNamegetTimeValues、および getDataValues メソッドを定義しなければなりません。追加のメソッドで、カスタム ファイルに存在する可能性のある特定のメタデータにアクセスできます。この例のクラス定義は、抽象メソッドおよび supportsFile メソッドと getChildren メソッドを定義します。

supportsFile メソッドはファイルの内容をチェックして、ファイルに信号データが含まれているか確認します。

function supported = supportsFile(~,filename)
    try
        t = readtable(filename);
        supported = height(t) > 0 && numel(t.Properties.VariableNames) > 1;
    catch
        supported = false;
    end
end

ファイルから複数の信号をインポートするには、最上位ノードにファイルがある階層型としてデータを扱います。リーダーは getChildren メソッドを使用して、ファイル内の各信号の ExcelFirstColumnTimeReader オブジェクトを作成します。

function childObj = getChildren(obj)
    childObj = {};
    if isempty(obj.VariableName)
        t = readtable(obj.FileName);
        vars = t.Properties.VariableNames;
        vars(1) = [];
        childObj = cell(size(vars));
        for idx = 1:numel(vars)
            childObj{idx} = ExcelFirstColumnTimeReader;
            childObj{idx}.FileName = obj.FileName;
            childObj{idx}.VariableName = vars{idx};
        end
    end
end

getTimeValues メソッドは、関数 readtable を使用してファイル内のデータを読み取り、時間データとして使用する、シミュレーション データ インスペクターの最初の列のデータを返します。

function timeVals = getTimeValues(obj)
    timeVals = [];
    if ~isempty(obj.VariableName)
        t = readtable(obj.FileName);
        timeName = t.Properties.VariableNames{1};
        timeVals = t.(timeName);
    end
end

getName メソッドは、ファイル名をインポート データの最上位ノードの名前として使用します。getChildren メソッドで返された対応する ExcelFirstColumnTimeReader オブジェクトの VariableName プロパティを使用して信号の名前が付けられます。

function retName = getName(obj)
    if isempty(obj.VariableName)
        fullName = obj.FileName;
        [filepath,name,ext] = fileparts(fullName);
        retName = strcat(name,ext);
    else
        retName = obj.VariableName;
    end
end

getDataValues メソッドは、信号データである最初のデータだけでなく、データが含まれる各列のデータを返します。各信号のデータには、getChildren メソッドで返された対応するオブジェクトの VariableName プロパティを使用してアクセスします。

function dataVals = getDataValues(obj)
    dataVals = [];
    if ~isempty(obj.VariableName)
        t = readtable(obj.FileName);
        dataVals = t.(obj.VariableName);
    end
end

シミュレーション データ インスペクターへのカスタム リーダーの登録

カスタム データ リーダーのクラス定義ファイルを記述した後に、そのリーダーを使用してデータをインポートする前にシミュレーション データ インスペクターにリーダーを登録する必要があります。シミュレーション データ インスペクターでは、MATLAB セッションの間に登録されたリーダーは保存されないため、新しい各 MATLAB セッションの開始時にカスタム リーダーを登録する必要があります。ワークスペースからデータを読み取る、またはファイルからデータを読み取るカスタム リーダーを登録できます。この例のファイル リーダーを登録するために、registerFileReader メソッドを使用します。

registerFileReader(ExcelFirstColumnTimeReader,[".xlsx" "xls"]);

ファイル リーダーが登録されていることを確認するには、io.reader.getRegisteredFileReaders メソッドを使用します。

io.reader.getRegisteredFileReaders
ans = 
"ExcelFirstColumnTimeReader"

カスタム形式のファイルからのデータのインポート

カスタム ファイル リーダーを登録した後に、シミュレーション データ インスペクターの UI または関数 Simulink.sdi.createRun を使用してカスタム形式のファイルからデータをインポートできます。この例では、4 つのデータの列を含むファイルから単純なデータセットをインポートします。この例のカスタム ファイル リーダーは常に最初の列 (この例では a) を時間データとして読み込みます。

Four columns of data

UI を使用してデータをインポートするには、シミュレーション データ インスペクターを開きます。関数 Simulink.sdi.view を使用して、MATLAB コマンド ウィンドウからシミュレーション データ インスペクターを開くことができます。次に、[インポート] をクリックします。

[インポート] ダイアログで、[ファイル] オプションを選択し、ファイルから新しい実行にデータをインポートします。フォルダーをクリックしてファイル システムを参照し、インポートするファイルを選択します。この例のファイルは CustomFile.xlsx と呼ばれます。

登録済みの複数のカスタム リーダーに対応する拡張子をもつファイルを選択すると、使用するリーダーを選択するオプションがダイアログに表示されます。この例では、組み込みの Microsoft Excel ファイル リーダーまたはこの例で記述されたカスタム リーダーを選択できます。既定では、選択したファイルの拡張子で使用できるカスタム リーダーが選択されます。

Import dialog box

ファイルからインポートする信号を選択できます。すべての信号を選択または選択解除するには、[名前] の横にあるチェック ボックスを使用します。選択した後に、[インポート] をクリックします。データが Imported_Data という名前の新しい実行にインポートされます。

データをプログラムによりインポートするには、関数 Simulink.sdi.createRun を使用します。シミュレーション データ インスペクターには、Microsoft Excel ファイル用の組み込みリーダーがあります。関数 Simulink.sdi.createRun の呼び出しでデータをインポートするために使用するリーダーを指定できます。データのインポートに使用するリーダーを指定しない場合、シミュレーション データ インスペクターでは、ファイル拡張子をサポートする最初のカスタム リーダーが使用されます。

Simulink.sdi.createRun('Custom File Run','file','CustomFile.xlsx','ExcelFirstColumnTimeReader');

インポートしたデータの検査と解析

データをインポートした後に、シミュレーション データ インスペクターを使用して、インポート データを単独でまたは関連のシミュレーション データと一緒に検査および解析できます。

The data from CustomFile plotted in the Simulation Data Inspector

参考

クラス

関数

関連するトピック