Main Content

getDataValues

Class: io.reader
Package: io

Return data values for data imported using a custom reader

Syntax

dataVals = getDataValues(obj)

Description

dataVals = getDataValues(obj) returns data values to use for data imported into the Simulation Data Inspector using a custom file or workspace variable reader. Specify code for the getDataValues method to extract signal values from a proprietary file or variable format.

Input Arguments

expand all

Custom data reader, specified as an object of a class that inherits from the io.reader base class.

Example: MyCustomFileReader

Output Arguments

expand all

Signal values, returned as an array of numeric, enumeration, logical, or string values. For scalar signals and wide signals, the first dimension of the array aligns with time and must match the length of the time vector returned by getTimeValues. For multidimensional signals, the last dimension aligns with time and must match the length of the time vector returned by getTimeValues.

Attributes

Abstracttrue

To learn about attributes of methods, see Method Attributes.

Examples

expand all

Write the function definition for the getDataValues method to return signal values to use for data imported from a file. The custom reader in this example imports the data from the file with a hierarchical structure, treating the file as the top node. Specify the code for the getDataValues method in the class definition file.

This example does not show a complete class definition. All custom readers must define behavior for the getName, getTimeValues, and getDataValues methods. For an example that shows the complete class definition and import workflow, see Import Data Using a Custom File Reader.

In this example, the getChildren method reads the data from the file using the readtable function and returns an array of custom reader objects for the top-level node that corresponds to the file and for each signal in the file. Then, the getDataValues method reads the data using the readtable function and selects the signal data to return for each signal in the file using the VariableName property of each custom reader object.

classdef ExcelFirstColumnTimeReader < io.reader
  methods
    % ...

    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  

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

  % ...
  end
end

Write the function definition for the getDataValues method to return signal values from a workspace variable. Specify the code executed by the getDataValues method in the class definition file.

This example does not show a complete class definition. All custom readers must define behavior for the getName, getTimeValues, and getDataValues methods, and workspace data readers need to define the supportsVariable method. For an example that shows the complete class definition and import workflow for a workspace data reader, see Import Workspace Variables Using a Custom Data Reader.

The custom reader in this example imports a structure or an array of structures from the workspace. The structures must contain fields for the signal data (d), the time data (t), and the signal name (n). When the variable to import is a scalar structure, the getDataValues method returns the data from the d field of the structure.

When the variable is an array of structures, the custom reader uses both the getDataValues and getChildren methods to import the data. The getChildren method creates a custom reader object for each structure in the array and sets the ChannelIndex property to identify the index of the signal data within the array. Then, the getDataValues method uses the ChannelIndex property value to select the appropriate structure from the VariableValue property value, which is the array of structures.

classdef SimpleStructReader < io.reader
  
  properties
    ChannelIndex
  end

  methods
    % ...

    function childObj = getChildren(obj)
      childObj = {};
      if ~isscalar(obj.VariableValue) && isempty(obj.ChannelIndex)
        numChannels = numel(obj.VariableValue);
        childObj = cell(numChannels,1);
        for idx = 1:numChannels
          childObj{idx} = SimpleStructReader;
          childObj{idx}.VariableName = sprintf('%s(%d)',obj.VariableName,idx);
          childObj{idx}.VariableValue = obj.VariableValue;
          childObj{idx}.ChannelIndex = idx;
        end
      end
    end

    function dataVals = getDataValues(obj)
      if isscalar(obj.VariableValue)
        dataVals = obj.VariableValue.d;
      elseif ~isempty(obj.ChannelIndex)
        varVal = obj.VariableValue(obj.ChannelIndex);
        dataVals = varVal.d;
      else
        dataVals = [];
      end
    end

  % ...
  end
end
Introduced in R2020b