Formato de valores separados por comas

En esta página se describe la implantación de muestra del formato de valores separados por comas.

Formato de fichero de muestra

En esa muestra, los datos se almacenan como un fichero de valores separados por comas.

Nota: los valores de este ejemplo no pueden contener un carácter de coma literal. Se añade esta restricción con vistas a simplificar la implantación del analizador de ficheros. La lógica de análisis se puede volver a implantar para evitar esta restricción. No afectará al resto de la funcionalidad.

El fichero CSV de muestra contiene los tipos de registro siguientes:

Consumo de intervalo: se utiliza para medidas de consumo de intervalo

Eventos de dispositivo: se utiliza para eventos de dispositivo

Registro de pista: se utiliza para proporcionar la fecha y hora de lectura y el número de registros de evento de dispositivo y consumo de intervalo en el fichero

Formato de consumo de intervalo

Nombre de campo

Tipo

Definición

1

ID de tipo de registro

Valor constante "U"

Identificador del tipo de registro

2

Fecha/hora de inicio

Hora en el formato de tiempo Unix.

Fecha/hora de inicio de la lectura del contador

3

Fecha/hora de finalización

Hora en el formato de tiempo Unix.

Fecha/hora de finalización de la lectura del contador

4

ID de dispositivo

Texto arbitrario

Identificador de dispositivo

5

Duración de intervalo

Número entero

El intervalo de tiempo entre las lecturas en segundos (segundos por intervalo).

6

UM

Texto arbitrario

Describe las unidades de los valores de datos

7

Entradas de datos

Punto flotante numérico y texto arbitrario opcional separados por “:”

Cada registro puede contener un número ilimitado de campos de entrada de datos. Cada entrada de datos es un juego de dos campos: un valor de lectura y un indicador de estado de lectura opcional. Los campos se separan con el carácter “:”. El separador no se indica cuando no se proporciona el indicador de estado de lectura.

Formato de evento de dispositivo

Nombre de campo

Tipo

Definición

1

ID de tipo de registro

Valor constante "E"

Identificador del tipo de registro

2

Fecha/hora de evento

Hora en el formato de tiempo Unix.

La fecha y hora a la que ha sucedido el evento

3

ID de dispositivo

Texto arbitrario

Identificador de dispositivo

4

Nombre de evento

Texto arbitrario

El nombre de identificación principal del evento

Formato de registro de pista

Nombre de campo

Tipo

Definición

1

ID de tipo de registro

Valor constante "T"

Identificador del tipo de registro

2

Fecha/hora de creación

Hora en el formato de tiempo Unix.

Fecha/hora de inicio de la lectura del contador

3

Registros totales

Número entero

Muestra el número de registros en el fichero

Fichero de muestra

U,1,86400,DEVICE_DG_0,900,KWH,1:S,2.5,-3.99:R,4:B
E,86400,DEVICE_DG_1,Power Outage
U,2,86400,DEVICE_DG_2,900,KWH,1:S,2,3:R,4:B,5,6,7:A
E,86402,DEVICE_DG_3,Tamper attempt suspected
U,3,86400,DEVICE_DG_4,900,KWH,1:S
T,86401,5

Scripts de muestra

La implantación de muestra incluye los siguientes scripts de muestra diseñados para su uso con el formato CSV anterior:

DG_​SmplPrCSV: este script de muestra incluye un método en la interfaz de biblioteca – getParser(). El método devuelve una instancia de la clase que implanta la interfaz com.splwg.d1.domain.sgg.dg.processing.PayloadParser. La clase contiene la lógica siguiente:

  1. Analiza una carga útil entrante en el formato CSV.

  2. Transforma los datos entrantes en estructuras relacionadas con consumo o eventos, según el tipo de datos entrantes.

  3. Devuelve, una a una, dichas estructuras en formato XML sin formato.

DG_​SmPrCSVCh: este script se proporciona como una muestra para demostrar cómo se analiza el formato CSV en fragmentos (creados mediante el parámetro chunkSize) con el uso de una ayuda. Este script de muestra incluye un método en la interfaz de biblioteca – getParser(). El método devuelve una instancia de la clase que implanta las interfaces com.splwg.d1.domain.sgg.dg.processing.ChunkProcessor y com.splwg.d1.domain.sgg.dg.processing.GenericPayload.

La interfaz ChunkProcessor distingue un procesador que reconoce la fragmentación del resto de implantaciones. Un analizador personalizado implantado en Groovy debería implantar esta interfaz. La interfaz GenericPayload define métodos necesarios para acceder a una carga útil mediante ayudas específicas. Mediante esta interfaz, un analizador personalizado accede a una instancia de LineReaderChunked.

Si el parámetro dinámico chunkSize no está definido en una configuración de procesamiento de carga útil de SGG, se procesará toda la carga útil. Consulte Parámetros comunes para obtener más información sobre el parámetro chunkSize.

La clase contiene la lógica siguiente:
  1. Lee una línea de la carga útil entrante mediante el uso del método LineReaderChunked.readLineWithinChunk()

  2. Analiza una línea en la carga útil entrante (en formato CSV) que se leyó en el paso anterior.

  3. Transforma los datos entrantes en estructuras relacionadas con consumo o eventos, según el tipo de datos entrantes.

  4. Devuelve, una a una, dichas estructuras en formato XML sin formato.

DG_​SmplTrCSV: este script de muestra incluye un método en la interfaz de biblioteca – getTransformer(). El método devuelve una instancia de la clase que implanta la interfaz com.splwg.d1.domain.sgg.dg.processing.PayloadTransformer. La clase contiene la lógica siguiente:

  1. Transforma el mensaje entrante en formato XML sin formato al formato “nativo” (nodos de XML de predefinición de datos iniciales de medida o de predefinición de evento de dispositivo).

  2. Añade nuevos nodos de XML como nodos secundarios a la lista de resultados indicada.

Utilice el portal de Script para ver estos scripts con más detalle.

Análisis

El script analizador realiza la asignación de datos siguiente.

Asignación de consumo de intervalo a XML sin formato

La siguiente tabla muestra la asignación entre los campos de datos de intervalos entrantes y los elementos secundarios del elemento Carga útil/Consumo en XML "sin formato":

Campo de consumo de intervalo Elemento de XML sin formato

ID de tipo de registro

RecordType

Fecha/hora de inicio

StartDateTime

Fecha/hora de finalización

EndDateTime

ID de dispositivo

DeviceId

Duración de intervalo

IntervalDuration

UM

UM

Entradas de datos

Intervalos/

Intervalo/

Valor

[Estado]

Contenido de un registro de fichero entrante.

RawData

Asignación de evento a XML sin formato

La tabla siguiente muestra la asignación entre los campos de datos de intervalos entrantes y los elementos secundarios del elemento Carga útil/Evento en XML "sin formato":

Campo de evento de dispositivo Elemento de XML sin formato

ID de tipo de registro

RecordType

Fecha/hora de evento

DateTime

ID de dispositivo

DeviceId

Nombre de evento

Nombre

Contenido de un registro de fichero entrante.

RawData

Esquema XML de formato XML sin formato

El formato XML sin formato incluye a la vez elementos relacionados de evento de dispositivo y consumo de intervalo.

<xs:schema attributeFormDefault="unqualified" 
elementFormDefault="qualified" 
targetNamespace="http://xmlns.oracle.com/GenericAdapter" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:ga="http://xmlns.oracle.com/GenericAdapter">
  <xs:element name="Payload" type="ga:PayloadType"/>
  <xs:complexType name="PayloadType">
    <xs:sequence>
      <xs:choice>
        <xs:element name="Usage" type="ga:UsageType"/>
        <xs:element name="Event" type="ga:EventType"/>
      </xs:choice>
      <xs:element name="RawData"  type="ga:NonEmptyString"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="UsageType">
    <xs:sequence>
      <xs:element name="RecordType" type="ga:RecordTypeUsageType"/>
      <xs:element name="StartDateTime" type="xs:integer"/>
      <xs:element name="EndDateTime" type="xs:integer"/>
      <xs:element name="DeviceId" type="ga:NonEmptyString"/>
      <xs:element name="IntervalDuration" type="xs:integer"/>
      <xs:element name="UOM" type="ga:NonEmptyString"/>
      <xs:element name="Intervals" type="ga:IntervalList"/>
    </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="RecordTypeUsageType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="U"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="IntervalList">
    <xs:sequence maxOccurs="unbounded">
      <xs:element name="Interval" type="ga:IntervalType"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="IntervalType">
    <xs:sequence>
      <xs:element name="Value" type="xs:float"/>
      <xs:element name="Status" type="ga:NonEmptyString" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="EventType">
    <xs:sequence>
      <xs:element name="RecordType" type="ga:RecordTypeEventType"/>
      <xs:element name="DateTime" type="xs:integer"/>
      <xs:element name="DeviceId" type="ga:NonEmptyString"/>
      <xs:element name="Name" type="ga:NonEmptyString"/>
    </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="RecordTypeEventType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="E"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="NonEmptyString">
    <xs:restriction base="xs:string">
      <xs:minLength value="1"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>
Nota: una parte del fichero entrante que se ha utilizado para generar la estructura actual de XML sin formato se colocará en el elemento Carga útil/RawData.

Transformación

El script transformador realiza la asignación siguiente.

Asignación de XML sin formato a XML de predefinición

El transformador de carga útil crea los elementos XML de predefinición de evento de dispositivo y/o datos iniciales de medida de la manera siguiente:

Asignación de consumo: si el nombre del nodo Carga útil/* es igual que 'Consumo' (consumo de intervalo), el script crea un elemento XML con un nombre definido en el campo de Configuración de procesamiento carga útil SGG “ON de predefinición de datos iniciales de medida (intervalo)” y la estructura según la tabla de asignación siguiente:

Elemento de XML sin formato

Elemento de predefinición de datos iniciales de medida

Notas

RecordType

No aplicable

DeviceId

dvcIdN

UM

externalUOM

IntervalDuration

Segundos por intervalo

StartDateTime

stDt

Convertir a tipo de "dateTime" de OUAF

EndDateTime

enDt

Convertir a tipo de "dateTime" de OUAF

Intervalos/

Intervalo/

Valor [Estado]

msrs

Valor

msrs/mL/q

Estado ->

msrs/mL/sts/stsL/st

No aplicable

imdType

Valor constante 'D1IL'

externalId

Valor almacenado en el método setOrigin.

serviceProviderExternalId

Valor almacenado en el método setConfiguration.

RawData

rawData

Si la configuración de procesamiento de carga útil de Smart Grid Gateway tiene la casilla de control Rellenar RAW marcada.

Asignación de evento de dispositivo: si el nombre del nodo Carga útil/* es igual que 'Evento' (datos de evento de dispositivo), se crea un elemento XML con un nombre definido en el campo de Configuración de procesamiento carga útil SGG “Objeto de negocio de predefinición de evento de dispositivo” y la estructura según la tabla de asignación siguiente:

Elemento de XML sin formato

Elemento de predefinición de evento de dispositivo

Nota

RecordType

No aplicable

DateTime

eventDateTime

Convertir a tipo de "dateTime" de OUAF

DeviceId

externalUOM

Nombre

externalEventName

externalSourceIdentifier

Valor almacenado en el método setOrigin.

externalSenderId

Valor almacenado en el método setConfiguration.

RawData

rawEventInformation

Si la configuración de procesamiento de carga útil de Smart Grid Gateway tiene la casilla de control Rellenar RAW marcada.