Das Importieren von CSV-Dateien wird oft dazu genutzt, eine Map mit Schlüssel-Wert-Paaren zu befüllen, deren Werte wiederum Maps enthalten.
Entweder wird eine CSV-Datei importiert, um auch ein neues Projekt anzulegen und dabei die passenden Konfigurationswerte in einer Map abzulegen oder es wird während der Konfiguration eine CSV-Datei importiert, die passend zum aktuellen Konfigurations-Schritt Werte in einer Map ablegt.
Das folgende Szenario beschreibt den Fall, dass beim Import der CSV-Datei ein neues Projekt angelegt und eine Map mit Werten befüllt wird. Mit Hilfe eines Form-UIs wird eine Bauform abgefragt, sodass aus der Map ein einzelner Wert, der wiederum eine Map ist, ermittelt wird. Aus dieser Map werden die einzelnen Werte abgefragt und im Form-UI angezeigt.
Als Basis für dieses Szenario dient das Tutorial-Modell Feeder (siehe Tutorial).
Dazu sind folgende Erweiterungen zu erstellen:
Parametername | Typ |
---|---|
ParameterMap | Map |
ParameterMap1 | Map |
ParameterBag | Bag |
Make | String |
Power | String |
Relay | String |
Drive | String |
Cable | String |
MotorProtectiveCircuitBreaker | String |
Parametername | Wert |
---|---|
ParameterMap | =$ParameterMap1.select(x|x.key=$Make) |
ParameterMap1 | Der Wert dieser Map besteht nach dem Import aus den Werten der CSV-Datei. |
ParameterBag | =$ParameterMap.select(x|x.key=$Make).values |
Make | Der Wert dieses Parameters wird durch die Auswahl im Form-UI bestimmt. |
Power | =$ParameterBag.value('Power').asList.first |
Relay | =$ParameterBag.value('Relay').asList.first |
Drive | =$ParameterBag.value('Drive').asList.first |
Cable | =$ParameterBag.value('Cable').asList.first |
MotorProtectiveCircuitBreaker | =$ParameterBag.value('MotorProtectiveCircuitBreaker').asList.first |
<?xml version="1.0" encoding="UTF-8"?>
<uis xmlns="http://www.mind8.com/FormUI"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<form title="Import" id="import">
<group id="ConveyorSelection" title="Conveyor Selection">
<label>Size</label>
<input receiver="=parameter('Make')" type="radio" values="=List{Pair{'Short Belt','C1'},Pair{'Medium Belt','C2'},Pair{'Large Belt','C3'}}"></input>
<label>Drive</label>
<input type="text" receiver="=parameter('Drive')" editable="false" ></input>
<label>Power</label>
<input type="text" receiver="=parameter('Power')" editable="false"></input>
<label>Relay</label>
<input type="text" receiver="=parameter('Relay')" editable="false"></input>
<label>Motor Protective Circuit Breaker</label>
<input type="text" receiver="=parameter('MotorProtectiveCircuitBreaker')" editable="false"></input>
<label>Cable</label>
<input type="text" receiver="=parameter('Cable')" editable="false"></input>
</group>
</form>
</uis>
Make;Drive;MotorProtectiveCircuitBreaker;Relay;Cable;Power
C1;K21R63K4;PKZM0-063;DILM7;MC4G1,5;0.12kW
C2;K21R71K4;PKZM0-1;DILM7;MC4G1,5;0.25kW
C3;IE3-W41R90SY4;PKZM0-4;DILM7;MC4G2,5;1.1kW
Beispiel-Schema-Datei für den Import (KeyValue_ConveyorData.xsl):
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- STM Stuttgart 01.09.2015-->
<!-- (c) Copyright EPLAN Software & Service GmbH & Co. KG, Stuttgart, 2015. -->
<!-- stylesheet for csv and excel import of keys and values -->
<!--+++++++++++++++++++++++++++++++++++++++++++++++++++++ Area to customize this xslt ++++++++++++++++++++++++++++++++++++++++++++++++-->
<!-- name of the parameter used for map ('ParameterMap') -->
<xsl:variable name="ParameterMap1" select="'ParameterMap1'"/>
<!-- to use a specific ExcelSheet please enter the name as String ('first') or get the name by xPath -->
<xsl:variable name="ExcelSheet" select="xmlTable/sheet[1]/@name"/>
<!-- the end of the header is either a variable row defined by a string or a fix row -->
<xsl:variable name="KeyWordLineEndHeader" select="'LineEndHeader'"/>
<!-- there should always be just one of the next two <xsl:variable> entries active (= uncommented) -->
<!-- if the header is a variable row defined by a string then use (and modify) this entry -->
<xsl:variable name="LineEndHeader">
<xsl:choose>
<xsl:when test="xmlTable/sheet[@name=$ExcelSheet]/row/col[.=$KeyWordLineEndHeader]/../@number">
<xsl:value-of select="xmlTable/sheet[@name=$ExcelSheet]/row/col[.=$KeyWordLineEndHeader]/../@number"/>
</xsl:when>
<xsl:when test="xmlTable/row/col[.=$KeyWordLineEndHeader]/../@number">
<xsl:value-of select="xmlTable/row/col[.=$KeyWordLineEndHeader]/../@number"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- if the header is defined by a fix row (e.g. =1 or =0 if no header is used) then use (and modify) this entry -->
<!--
<xsl:variable name="LineEndHeader">
<xsl:value-of select="0"/>
</xsl:variable>
-->
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<imx>
<xsl:element name="parameter">
<xsl:attribute name="name">
<xsl:value-of select="$ParameterMap1"/>
</xsl:attribute>
<value>
<hashMap>
<xsl:apply-templates select="xmlTable"/>
</hashMap>
</value>
</xsl:element>
</imx>
</xsl:template>
<xsl:template match="xmlTable">
<xsl:choose>
<xsl:when test="sheet">
<xsl:apply-templates select="sheet"/>
</xsl:when>
<xsl:when test="row">
<xsl:apply-templates select="row"/>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="sheet">
<xsl:if test="@name=$ExcelSheet">
<xsl:apply-templates select="row"/>
</xsl:if>
</xsl:template>
<xsl:template match="row" >
<xsl:choose>
<xsl:when test="@number > $LineEndHeader ">
<put>
<xsl:element name="key">
<xsl:attribute name="value">
<xsl:value-of select="col[@number='1']"/>
</xsl:attribute>
</xsl:element>
<xsl:element name="value">
<!-- <put>
<value> -->
<hashMap>
<!-- <xsl:value-of select="''"/> -->
<put>
<xsl:attribute name="key">
<xsl:value-of select="'Make'"/>
</xsl:attribute>
<xsl:element name="value">
<xsl:attribute name="value">
<xsl:value-of select="col[@number='1']"/>
</xsl:attribute>
</xsl:element>
</put>
<put>
<xsl:attribute name="key">
<xsl:value-of select="'Drive'"/>
</xsl:attribute>
<xsl:element name="value">
<xsl:attribute name="value">
<xsl:value-of select="col[@number='2']"/>
</xsl:attribute>
</xsl:element>
</put>
<put>
<xsl:attribute name="key">
<xsl:value-of select="'MotorProtectiveCircuitBreaker'"/>
</xsl:attribute>
<xsl:element name="value">
<xsl:attribute name="value">
<xsl:value-of select="col[@number='3']"/>
</xsl:attribute>
</xsl:element>
</put>
<put>
<xsl:attribute name="key">
<xsl:value-of select="'Relay'"/>
</xsl:attribute>
<xsl:element name="value">
<xsl:attribute name="value">
<xsl:value-of select="col[@number='4']"/>
</xsl:attribute>
</xsl:element>
</put>
<put>
<xsl:attribute name="key">
<xsl:value-of select="'Cable'"/>
</xsl:attribute>
<xsl:element name="value">
<xsl:attribute name="value">
<xsl:value-of select="col[@number='5']"/>
</xsl:attribute>
</xsl:element>
</put>
<put>
<xsl:attribute name="key">
<xsl:value-of select="'Power'"/>
</xsl:attribute>
<xsl:element name="value">
<xsl:attribute name="value">
<xsl:value-of select="col[@number='6']"/>
</xsl:attribute>
</xsl:element>
</put>
</hashMap>
<!-- </value>
</put> -->
</xsl:element>
</put>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<imx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude" version="1.0">
<project name="Feeder" save="true">
<libraries>
<add type="String" value="T_Mechatronic_ModularSystem"/>
</libraries>
<mo name="Feeder" typeClass="T_Mechatronic_ModularSystem.Mechatronic.Stations.Feeder" >
<importFragment/>
</mo>
</project>
</imx>
Um ein neues Projekt anzulegen ist die CSV-Datei zu importieren:
- Öffnen Sie den Import-Assistenten über Datei > Importieren....
- Markieren Sie Projekt > Import.
- Klicken Sie [Weiter >].
- Geben Sie im Feld Quell-Dateinamen den Namen der CSV-Datei ein (Beispiel: ConveyorData.csv).
- Wählen Sie für den Typ des Schemas den Eintrag Kunden-Schema.
- Geben Sie im Feld Kunden-Schema den Namen der Schema-Datei ein (Beispiel: KeyValue_ConveyorData.xsl).
- Geben Sie im Feld Dateiname der Vorlage den Namen der Vorlagendatei ein (Beispiel: Template_CSV.imx).
- Geben Sie im Feld Neues Projekt anlegen gegebenenfalls einen anderen Namen für das neue Projekt ein.
- Klicken Sie [Fertigstellen].
Das neue Projekt ist anschließend im Projekt-Katalog eingetragen.
Um das Ergebnis zu kontrollieren ist im neuen Projekt die Komponente Feeder zu öffnen:
- Öffnen Sie im Projekt-Katalog die Komponente Feeder.
- Öffnen Sie die Editorseite Parameter.
Der Parameter ParameterMap1 ist durch den Import mit einer Map befüllt:
[
C1»[Cable»MC4G1,5,MotorProtectiveCircuitBreaker»PKZM0-063,Relay»DILM7,Drive»K21R63K4,Make»C1,Power»0.12kW],
C2»[Cable»MC4G1,5,MotorProtectiveCircuitBreaker»PKZM0-1,Relay»DILM7,Drive»K21R71K4,Make»C2,Power»0.25kW],
C3»[Cable»MC4G2,5,MotorProtectiveCircuitBreaker»PKZM0-4,Relay»DILM7,Drive»IE3-W41R90SY4,Make»C3,Power»1.1kW]
]
Alle anderen Parameterwerte können erst ermittelt werden, nachdem im Form-UI eine Auswahl getroffen worden ist.
Treffen Sie im Form-UI eine Auswahl:
- Öffnen Sie die Editorseite Import.
- Markieren Sie eine Option für Size.
Die Werte für die darunter angeordneten Felder werden berechnet und angezeigt.
Die folgende Abbildung zeigt für alle Optionen die Ergebnisse nebeneinander: