max16hr
Goto Top

Daten zusammenfassen, dann bearbeiten und wieder trennen

Hallo allerseits!

Ich bin hier in folgender Situation:
Es sollen einige hundert Skripte ausgeführt werden. Jedes dieser Skripte benötigt dabei bestimmte Parameter. Diese sind für jedes Skript jeweils in einer Datei beschrieben. Es gibt also auch mehrere hundert solcher Dateien.

Für eine spezielle Konfiguration muss nun in jede Datei rein geschaut und die entsprechenden Parameter angepasst werden. Das ist bei so vielen Dateien einfach mega anstrengend, zumal sehr oft auch identische Parameter benötigt werden, die trotzdem mehrmals ausgefüllt werden müssen.

Das Ziel ist daher, diese benötigten Daten aller Skripte zunächst zusammen zu fassen, sie dann gebündelt anzupassen und sie wieder auf die einzelnen Skripte aufzuteilen.
Ich möchte also ein Framework oder ähnliches, dass die "Fragen" aus den einzelnen Skripten zu einem Fragenkatalog bündelt und die "Antworten" hinterher wieder auf die einzelnen Fälle verteilt.

Ich denke, ich bin nicht der erste, der vor einem solchen Problem steht. Bestimmt gibt es schon Lösungsansätze oder gar fertige Programme für so etwas. Für mich ist dieses Problem hingegen ziemlich neu.
Habt ihr denn bereits Erfahrungen mit so einem Problem gemacht? Könnt ihr mir vielleicht Stichworte oder einfach nur eure Gedanken geben, wie man das am intelligentesten anstellen könnte?

Vielen Dank und liebe Grüße!
Max

Content-Key: 306019

Url: https://administrator.de/contentid/306019

Printed on: April 24, 2024 at 23:04 o'clock

Mitglied: 129413
129413 Jun 02, 2016 updated at 11:45:13 (UTC)
Goto Top
Mit "Powershell" z.B. ein leichtes. Aber mit jeder halbwegs vernünftigen Programmiersprache ist so was schnell umgesetzt, sofern man Programmieren kann.
Für eine spezielle Konfiguration muss nun in jede Datei rein geschaut und die entsprechenden Parameter angepasst werden.
Ein leichtes mit einem Regex-Replace.
Bestimmt gibt es schon Lösungsansätze
Sicher, nur sind die meist so speziell angepasst das du damit nicht viel anfangen könntest. Deswegen sind solche Lösungen meist immer individuell zusammengestellt welche Programmierer dann umsetzen.

Wenn du mehr Details dazu postest können wir dir hier auch konkrete Codebeispiele dazu posten. Gibt ja genug fähige Leute hier.

Gruß skybird.
Member: Max16hr
Max16hr Jun 02, 2016 updated at 12:49:21 (UTC)
Goto Top
Danke für die Antwort, skybird!
Ich werde mir das mal anschauen, von Regex-Replace hab ich zum Beispiel noch nie gehört face-smile

Aber gut, ich werde dann mal konkreter:

Ich habe hier diverse Ordner, die jeweils ein Script enthalten, das auf eine weitere Datei, sagen wir "ParamForScript" zugreift. In ParamForScript werden also bestimmte Parameter beschrieben und die Werte festgelegt.

Diese Dateien sehen beispielsweise so aus:

ParamForScript1.xml:
<?xml version='1.0' encoding='UTF-8'?>  
<Parameters>
    <Parameter>
        <Name>Var_A</Name>
         <Value>1</Value>
    </Parameter>
    <Parameter>
        <Name>Var_B</Name>
        <Value>1</Value>
    </Parameter>
</Parameters>

ParamForScript2.xml:
<?xml version='1.0' encoding='UTF-8'?>  
<Parameters>
    <Parameter>
        <Name>Var_A</Name>
        <Value>1</Value>
    </Parameter>
    <Parameter>
        <Name>Var_C</Name>
        <Value>0</Value>
    </Parameter>
    <Parameter>
        <Name>Var_D</Name>
        <Value>0</Value>
    </Parameter>
</Parameters>

...


ParamForScript147.xml:
<?xml version='1.0' encoding='UTF-8'?>  
<Parameters>
    <Parameter>
        <Name>Var_A</Name>
        <Value>1</Value>
    </Parameter>
    <Parameter>
        <Name>Var_B</Name>
        <Value>0</Value>
    </Parameter>
    <Parameter>
        <Name>Var_X</Name>
        <Value>10</Value>
    </Parameter>
</Parameters>

usw.

Also es gibt unzählige Dateien, die jeweils Parameter beschreiben, welche teilweise identisch, teilweise verschieden sind.
Mit diesen dort beschriebenen Parametern werden dann die Scripte ausgeführt.

Und ich habe hier nun verschiedene Konfigurationen für diese Ausführung, z.B:
Var_A = 10
Var_B = 30
Var_C = -100
Var_D = 5
...
Var_X = 1
usw.

Bisher müsste ich nun in jede einzelne Datei gehen und den entsprechenden Wert per Hand eintragen. Allein Var_A müsste ich so über 100x ändern. Später brauche ich dann andere Werte und muss wieder jede Datei einzeln ändern. Das kann es ja nicht sein.

Was ich nun also möchte, ist eine neue Datei, ein Framework oder ähnliches, das mir sagt:
"Für die Ausführung der Scripte 1, 2 und 147 werden folgende Parameter benötigt:
Var_A, Var_B, Var_C, Var_D, Var_X."

Ich möchte dann in dieser Datei einmalig die entsprechenden Werte für Var_A, ... eintragen.
Und dann sollen die Ausgangsdateien ParamForScript1.xml etc (und zwar nur die) diese neuen Werte übernehmen und entsprechend automatisiert angepasst werden.
Damit dann die gewünschten Scripte in der entsprechenden Konfiguration ausgeführt werden können.

Und meine Frage ist halt: Gibt es bereits Konzepte, Frameworks, Programme oder ähnliches, die so etwas leisten können? Und wenn nicht, wie kann man das intelligent lösen? Welche Tools bieten sich da möglicherweise an?
Ich frage das so grundsätzlich, weil es nicht garantiert ist, dass hier xml-Formate vorliegen. Die Parameter können auch in anderen Dateitypen beschrieben werden. Dass ich hier dann für jeden Typ ein eigenes Script schreiben muss, um überhaupt an diese Daten heran zu kommen, ist klar.
Aber gibt es denn bereits Lösungen für diesen Prozess "Daten zusammen fassen, in gebündelter Form ändern und sie dann wieder in die ursprüngliche Form aufteilen"?

Danke face-smile
Mitglied: 129413
129413 Jun 02, 2016 at 12:47:44 (UTC)
Goto Top
Das lässt sich sehr leicht machen, die Daten die du ändern willst in eine CSV-Datei mit den Überschriften.
Var_A, Var_B, Var_C, Var_D, Var_X schreiben und dann per Schleife diese Daten in die XMLs übertragen, sollte sich in max 10 Zeilen oder weniger per Powershell lösen lassen.
Mitglied: 129413
Solution 129413 Jun 02, 2016 updated at 13:17:57 (UTC)
Goto Top
Hier ein kleines Beispiel für deine oben skizzierten XMLs um die angegebenen Variablen in den XML-Dateien automatisch für alle XML-Dateien eines Ordners anzupassen:

Natürlich kann man die Variablen auch in Text- oder CSV-Dateien auslagern und daraus ins Skript zu importieren, da sind der Phantasie keine Grenzen gesetzt
$folderXML = 'D:\xmldateien'  

$map = @{
    "Var_A"=10  
    "Var_B"=20  
    "Var_C"=30  
    "Var_D"=40  
    "Var_X"=50  
}

gci $folderXML -Filter *.xml | %{
    $xml = [xml](gc $_.FullName)
    $map.GetEnumerator() | %{
        $node = $xml.SelectSingleNode("/Parameters/Parameter/Name[.='$($_.Key)']")  
        if ($node){
            $node.NextSibling.innerText = $_.Value
        }
    }
    $xml.Save($_.FullName)
}
Wenn deine Parameterdateien natürlich in mehreren Formaten vorliegen musst du selbstredend darauf im Skript reagieren, ist aber alles relativ einfach machbar. Powershell ist für solche Aufgaben geradezu perfekt geeignet.

Ein Framework für so benutzerdefinierte Anpassungen wirst du IMHO nicht finden. Dafür gibts ja uns Programmierer face-wink
Viel Aufwand ist das definitiv nicht. Siehst ja wie schnell man so was zaubern kann.
Member: Max16hr
Max16hr Jun 03, 2016 at 11:47:16 (UTC)
Goto Top
Schon einmal ein ganz großes Dankeschön für diese Hilfe! face-smile

Ich werde auf jeden Fall mal versuchen, das für meine Beispiele umzusetzen. Das wird eine Zeit lang brauchen, denn mit der Powershell-Programmierung selbst bin ich noch nicht vertraut.

Dein Beispielprogramm verstehe ich jetzt gerade so:
- Man übergibt dem Programm einen Ordner, in dem alle Parameter-Dateien (im selben Format) liegen und legt dann ein Mapping fest, wo einzelnen Variablen auf ihren entsprechenden Wert gesetzt werden.
- Danach gehst du in jede einzelne Datei aus dem Parameter-Ordner. Dort gehst du dann alle Variablen aus dem Mapping durch und veränderst die Werte entsprechend
- Dann wird diese veränderte Datei wieder abgespeichert und in Parameter-Ordner hat man hinterher also Alle Parameter-Dateien in der gewünschten Konfiguration face-smile

Das klingt soweit erstmal sehr gut!
Ein wichtiger Punkt wäre nun noch, wie dieses Mapping erstellt wird. Gibt es in Powershell auch eine Möglichkeit, alle verwendeten Parameter aufzulisten? Denn bei vielen hundert Dateien weiß ich ja nicht, welche Variablen überhaupt gebraucht werden. Insgesamt sind das an die 1000 Variablen, von denen die auszuführenden Skripte aber nur 20 brauchen oder so.
Ich muss also irgendwie in jede Datei hineinschauen und alle Parameter heraussuchen und auflisten, um sie dann in dem Mapping entsprechend anpassen zu können.

Mir schwebt da so ein Bild vor: Ich gebe als User dem Programm einen Ordner mit allen Parameter-Dateien. Dann öffnet sich ein Dialog "Bitte geben sie die Werte für folgende Parameter ein:", darunter eine Liste mit allen benötigten Variablen. Dort trage ich dann die Werte für meine entsprechende Konfiguration ein, drücke auf ok, meine Parameter-Dateien werden automatisch angepasst und die Skripte können nun in dieser Konfiguration ausgeführt werden.
Mitglied: 129413
Solution 129413 Jun 03, 2016 updated at 12:43:25 (UTC)
Goto Top
Zitat von @Max16hr:
Dein Beispielprogramm verstehe ich jetzt gerade so:
- Man übergibt dem Programm einen Ordner, in dem alle Parameter-Dateien (im selben Format) liegen und legt dann ein Mapping fest, wo einzelnen Variablen auf ihren entsprechenden Wert gesetzt werden.
- Danach gehst du in jede einzelne Datei aus dem Parameter-Ordner. Dort gehst du dann alle Variablen aus dem Mapping durch und veränderst die Werte entsprechend
- Dann wird diese veränderte Datei wieder abgespeichert und in Parameter-Ordner hat man hinterher also Alle Parameter-Dateien in der gewünschten Konfiguration face-smile
Ja, korrekt.
Ein wichtiger Punkt wäre nun noch, wie dieses Mapping erstellt wird. Gibt es in Powershell auch eine Möglichkeit, alle verwendeten Parameter aufzulisten?
Ja, du kannst jede deiner Parameterdateien durchlaufen und alle Parameter extrahieren und alle eindeutigen (ohne doppelte Werte) in ein Array schreiben.
Ich muss also irgendwie in jede Datei hineinschauen und alle Parameter heraussuchen und auflisten, um sie dann in dem Mapping entsprechend anpassen zu können.
Kein Problem.
Mir schwebt da so ein Bild vor: Ich gebe als User dem Programm einen Ordner mit allen Parameter-Dateien. Dann öffnet sich ein Dialog "Bitte geben sie die Werte für folgende Parameter ein:", darunter eine Liste mit allen benötigten Variablen. Dort trage ich dann die Werte für meine entsprechende Konfiguration ein, drücke auf ok, meine Parameter-Dateien werden automatisch angepasst und die Skripte können nun in dieser Konfiguration ausgeführt werden.
Alles machbar, selbst eine GUI kannst du direkt mit PS bauen.
Mitglied: 129413
Solution 129413 Jun 03, 2016 updated at 12:46:00 (UTC)
Goto Top
# Ordner der Parameterdateien enthält
$folderXML = 'C:\XMLParameterDateien  

# Funktion Hole alle eindeutigen Parameter aus allen Parameterdateien
function Get-XMLUniqueParameters(){
    $params = @()
    gci $folderXML -Filter *.xml | %{
        $xml = [xml](gc $_.FullName)
        $params += $xml.SelectNodes("/Parameters/Parameter/Name") | select -Expand InnerText  
    }
    return ($params | select -Unique)
}

# Funktion: Setze die Werte in den Parameterdateien
function Set-XMLParameters($parameters){
    gci $folderXML -Filter *.xml | %{
        $xml = [xml](gc $_.FullName)
        $parameters.GetEnumerator() | %{
            $node = $xml.SelectSingleNode("/Parameters/Parameter/Name[.='$($_.Key)']")  
            if ($node){
                $node.NextSibling.innerText = $_.Value
            }
        }
        $xml.Save($_.FullName)
    }
}

cls
# Leere Map erstellen (enthält später unsere Parameter mit den Werten)
$map = @{}
# Alle Parameter abfragen und den User um Werteingabe auffordern
Get-XMLUniqueParameters | %{$map.$_ = read-host "Geben sie den Wert für Parameter '$_' ein"}  
write-host "Schreibe Werte in die Parameterdateien, bitte warten ... " -NoNewline -f Green  
# Rufe Funktion zum setzen der Parameter in den Parameterdateien auf
Set-XMLParameters $map
write-host "Fertig!" -f Cyan  
Member: Max16hr
Max16hr Jun 08, 2016 at 16:26:07 (UTC)
Goto Top
Wow! :D
Das funktioniert ja wirklich. Danke!
Ich hab mich jetzt mal längere Zeit mit Powershell beschäftigt. Das ist ja wirklich ein tolles Tool, gerade um mit solchen Dateien zu arbeiten. Hab jetzt auch Skripte für andere Parameter-Formate schreiben können und es funktioniert so, wie es soll face-smile
Sogar schon mit einer integrierten Eingabe-Gui, man muss keine Extra-Software installieren... Super! Genau so etwas habe ich gesucht.