internet2107
Goto Top

Powershell Experten gefragt

Ich habe leider noch das "kleine" Problem, dass ich inzwischen verschiedene Dinge abfragen und erstellen kann, jedoch derzeit am Ende meiner Möglichkeiten bin, diesen Baukasten so zusammenzubauen, dass das Ergebnis perfekt ist, bzw. das etwas verknüpft wird und zusammenarbeitet.

Am Ende wird mit einer Überwachungsroutine ein Ordner überwacht. Sobald in diesen Ordner eine bestimmte Datei gelegt wird, soll ein Prozess eine CSV Datei daraus machen.
Aktuell ist es so, dass ich zwar diese(eine) (Master)Datei auslesen und zum Beispiel in einer .ini-Datei Einstellungen dazu vornehmen kann, aber mir fehlt der Wink mit dem Zaunpfahl dazu, wie ich mit den Einstellungen weiterarbeiten kann.

Im Klartext:
Masterdatei (diese unterscheidet sich später nur innerhalb durch verschiedene Nummern und Werte) wird je nach Auftrag alle paar Wochen eingelesen und in einer Listbox dargestellt. Durch ein bereits fertiges Script sehe ich demnach die entsprechende Positionen und Werte. Ich suche mir die wichtigen Positionen die wichtig sind, und schreibe das in eine .ini Datei. Soweit so gut. Das klappt auch alles einwandfrei. Bis hierhin läuft alles händisch.

Nun fehlt mir aber der Kniff, dass immer wenn eine neue Datei in diesem erwähnten Ordner auftaucht, diese durchsucht wird, und die Werte der entsprechenden Positionen, die in der .ini-Datei stehen, zum Export als CSV übergeben werden. Jede Datei in dem Ordner soll also aus der .ini-Datei die vorgegeben Positionen übernehmen und dann letztendlich eine CSV-Datei ausgeben. Ich habe zur Übersicht mal Teile des Scripts gepostet.
Der aktuell für mich nicht überwindbare Teil ist in "function konvertierung" zu finden und ist markiert. Hier soll also eine Verknüpfung entstehen: -->"Ich (ini-Datei) gebe dir hiermit die Position, nimm also den Wert hinter dem "="-Zeichen und schreibe es in das Array."

$path_settings2 = "settings_hl7_csv.ini"  
Get-Content $path_settings2 | ForEach-Object -Begin { $settings2 = @{ } } -Process { $store2 = [regex]::split($_, '='); if (($store2.CompareTo("") -ne 0) -and ($store2.StartsWith("[") -ne $True) -and ($store2[0].StartsWith("#") -ne $True)) { $settings2.Add($store2, $store2[1]) } }  

$src = $tb_HL7_einlesen.Text
$filesIN = $settings2.Get_Item("Quellpfad")  
$fileOUT = $settings2.Get_Item("Zielverzeichnis")  
$fileOUT_xls = $settings2.Get_Item("Zielverzeichnis_XLS")  

$msg = hl7-to-object((get-content $src))
(Get-ChildItem $filesIN) | foreach {
$HL7_reihe1 = (($msg | where { $_.Segment -eq "MSH" } | select -First 1).Fields)  
$array1 = $HL7_reihe1.split('|')  
1 .. ($array1.count - 0) | %{
$array1 = $array1.Replace("~\&", "")  
$array1 = $array1.Replace("MSH", "")  
$empty_entry_MSH = "$($array1[$_])=MSH_Position_$_"  
if ($($array1[$_]) -eq "") { $empty_entry_MSH = "" }  
$empty_entry_MSH = $empty_entry_MSH | Where { $_ -ne "" } | ForEach { $_.Replace(" ", "") }  
write-host $empty_entry_MSH
}

Auszug aus der .ini-Datei
[MSH]
MSH_Position_3=LAM
MSH_Position_4=DAS
MSH_Position_5=MS
MSH_Position_6=HRS

[PID]
MSH_Position_3=0080012103
MSH_Position_5=SC02
MSH_Position_6=Lab Integration


$process_HL7 = Get-ChildItem $filesIN *.HL7
while ($true)
{ if (Get-ChildItem $filesIN *.HL7)
{konvertierung} 
}

function konvertierung
{
<############# in diesem Bereich habe ich Probleme

$auswahl = $settings2.Get_Item | Where-Object { $_ -like "*Position*" }  

################>

$auswahl = $auswahl -join ","  
$arr = @();$arr += $auswahl
$obj = $arr | ConvertFrom-Csv -Delimiter ","  
# Export nach CSV
$obj | ConvertTo-Csv -Delimiter ";" -NoTypeInformation | Set-Content $fileOUT -Force | Set-Content UTF8  
if (!(Test-Path -path $filesIN\converted)) { New-Item -ItemType directory -Path $filesIN\converted }
move-item -path $filesIN\*.HL7 -destination $filesIN\converted
}

Content-Key: 328899

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

Printed on: April 16, 2024 at 19:04 o'clock

Mitglied: 132272
132272 Feb 09, 2017 updated at 07:19:52 (UTC)
Goto Top
Filesystemwatcher lautet das Stichwort
VBA - VBS : Umbennen und Verschieben von Dateien in Loop

Dazu braucht man aber keinen "Experten" face-big-smile. Besser wäre es, du würdest deine Titel aussagekräftiger gestalten.

Gruß
Member: internet2107
internet2107 Feb 09, 2017 at 07:42:12 (UTC)
Goto Top
Tja, und es wäre besser, wenn du mal Texte RICHTIG lesen würdest, bevor du einfach Lösungen präsentierst, die mit dem Problem nichts zu tun haben.
Es geht oben nicht darum einen Ordner zu überwachen. Das ist in anderen Teilen meines Scripts längst erledigt und arbeitet auch einwandfrei.
Also lies dir die Problemstellung noch mal genau durch und dann präsentiere eine konstruktive Lösung. Oder muss man dich erst wieder um alles "freundlich" bitten, so ja deine letzte Aussage bei einem anderen Problem.
Mitglied: 132272
132272 Feb 09, 2017 updated at 08:10:55 (UTC)
Goto Top
Zitat von @internet2107:
Tja, und es wäre besser, wenn du mal Texte RICHTIG lesen würdest, bevor du einfach Lösungen präsentierst, die mit dem Problem nichts zu tun haben.
Ich zitiere
"Nun fehlt mir aber der Kniff, dass immer wenn eine neue Datei in diesem erwähnten Ordner auftaucht, diese durchsucht wird"
Es geht oben nicht darum einen Ordner zu überwachen. Das ist in anderen Teilen meines Scripts längst erledigt und arbeitet auch einwandfrei.
Sieht man leider nicht.
Also lies dir die Problemstellung noch mal genau durch und dann präsentiere eine konstruktive Lösung. Oder muss man dich erst wieder um alles "freundlich" bitten, so ja deine letzte Aussage bei einem anderen Problem.
Dann beschreibe es besser, ziemlich wirr das ganze. Ich sehe hier leider dein Problem nicht, sorry.
Member: internet2107
internet2107 Feb 09, 2017 at 09:25:03 (UTC)
Goto Top
Tjaaa, und alles WICHTIGE was dahinter steht, liest und zitierst du leider nicht.
Dann halt noch mal viel ausführlicher.

In diesem Order, der überwacht wird, tauchen je nachdem 1-3 Dateien auf. Einzeln, oder gleichzeitig.
Diese Datei(n), die in diesem Ordner auftaucht/auftauchen, also in dem Ordner, der überwacht wird, soll die eine oder jeweilge Datei gelesen werden.
Diese Datei, eine sog. HL7-Datei enthält Werte an ganz bestimmen Stellen. Die jeweilige Position in der der HL7 ändert sich nie. Nur der jeweilige Wert an der Position.
Damit man das nicht jedes Mal "per Hand" machen muss, was auch klappt, soll das automatisch gehen.
Also soll ein Schleife diese Datei lesen, dann schauen "welche Position in der .ini-Datei ist für diesen Lauf wichtig" und es dann in einen Array schreiben. Der Array wird dann genommen und als CSV exportiert.

Es geht also bei dem Problem nur und einzig alleine darum, dass eine Schleife nur die Werte in einen Array speichert, die von der .ini-Datei festgelegt sind und in der HL7 Datei an den entsprechenden Positionen stehen. Alle anderen Werte der HL7 Datei sollen also unbeachtet bleiben.

Der Inhalt der HL7-Datei sieht so aus:
ORM^O01
|0080012103
|LAB

Der Inhalt der .ini-Datei sieht z.B. so aus:
[Reihenfolge]
[MSH]
MSH_Position_3=Wert1
MSH_Position_5=Wert2
MSH_Position_6=Wert3
[PID]
PID_Position_3=0080012103
PID_Position_5=SC02
PID_Position_6=WERT6
PID_Position_8=19750501
PID_Position_9=M
PID_Position_10=
[PV1]
PV1_Position_3=LAB
PV1_Position_19=00000504970000
PV1_Position_20=

Hier mal der Code zur .ini-Datei
Get-Content $path_settings2 | ForEach-Object -Begin { $settings2 = @{ } } -Process { $store2 = [regex]::split($_, '='); if (($store2.CompareTo("") -ne 0) -and ($store2.StartsWith("[") -ne $True) -and ($store2[0].StartsWith("#") -ne $True)) { $settings2.Add($store2, $store2[1]) } }  

### ab hier macht er nicht das, was er soll... 
$MSH = $settings2.Values | Where-Object { $_ -like "*MSH_Pos*" }  
$PID = $settings2.Values | Where-Object { $_ -like "*PID_Pos*" }  
...usw.

Darum bitte ich ganz lieb um Hilfe.
Mitglied: 132272
Solution 132272 Feb 09, 2017 updated at 09:42:32 (UTC)
Goto Top
Ein Dictionary ist keine Collection die per Schleife durchlaufen werden kann, dazu musst du sie erst mit GetEnumerator() aufrufen.
$dict = @{}
gc 'c:\datei.ini' | ?{$_ -Match '^(MSH|PID|PV1)'} | %{  
    $line = $_.split('=',2)  
    $dict.($line) = $line[1]
}
$dict.GetEnumerator() |?{$_.Key -Like "MSH*"}  
$dict.GetEnumerator() |?{$_.Key -Like "PID*"}  
Member: internet2107
internet2107 Feb 09, 2017 at 10:10:11 (UTC)
Goto Top
OK. Schon mal großen Dank. Das ist schon mal einen großen Schritt weiter.
Jedoch frage ich mich, wieso er in einer verkehrten Reihenfolge die Daten ausgibt?

Nehme ich dein Script oben....
..kommt heraus:
WERT5 WERT4 WERT2 WERT1 WERT6 usw...
es sollte ja aber nach der Reihenfolge gehen, also:
WERT1 WERT2 WERT4 WERT5 WERT6 usw..

Auszug aus der .ini Datei
[HL7_Reihenfolge]
[MSH]
MSH_Position_3=WERT1
MSH_Position_4=WERT2
MSH_Position_5=
MSH_Position_6=WERT4
MSH_Position_7=WERT5
MSH_Position_9=
MSH_Position_10=WERT6
MSH_Position_12=
MSH_Position_13=
MSH_Position_14=
[PID]
PID_Position_3=WERT1
PID_Position_5=WERT2
PID_Position_6=WERT3
PID_Position_8=WERT4
PID_Position_9=
PID_Position_10=
[PV1]
PV1_Position_3=WERT1
PV1_Position_19=WERT2
PV1_Position_20=
Mitglied: 132272
Solution 132272 Feb 09, 2017 updated at 10:29:30 (UTC)
Goto Top
Zitat von @internet2107:

OK. Schon mal großen Dank. Das ist schon mal einen großen Schritt weiter.
Jedoch frage ich mich, wieso er in einer verkehrten Reihenfolge die Daten ausgibt?
Weil ein Dictionary per Default nicht "ordered" ist.
Dazu musst du es [ordered] erstellen face-wink
$dict = [ordered]@{}
Google hätts dir gesagt
https://blogs.technet.microsoft.com/heyscriptingguy/2014/09/30/use-power ...
Member: internet2107
internet2107 Feb 09, 2017 at 10:36:31 (UTC)
Goto Top
Ja, natürlich. Da hast du Recht. Jedoch könnte ich mir auch die ganze Lösung insgesamt durch googeln zusammensuchen. Dann bräuchte ich dieses Forum nicht.
In jedem Fall danke für deine Hilfe. Schönen Tag.
LG
Member: internet2107
internet2107 Feb 09, 2017 at 12:13:26 (UTC)
Goto Top
Da bin ich aber leider doch noch mal face-sad
Tur mir leid.
Dank deiner Hilfe habe ich zwar nun das Wichtigste, aber nun auch 2 Arrays die letztendlich ja als Ausgabe dienen sollen.

Im ersten Array wird ja die HL7 Datei eingelesen
im zweiten Array (oben gelöst) wird die .ini-Datei eingelesen

Es müssen nun aber beide Arrays verglichen, aber praktisch zusammengebaut werden.
Dazu gibt es ja "Compare-Object $array1 $array2", ich weiß.

Was heißt das im Klartext?
Im Array 2 werden die Positionen eingetragen, macht er ja nun, dank deiner Hilfe.
Im Array 1 stehen aber die Werte drin.

Kurze Info und blöder Fehler meinerseits, in der .ini-Datei steht nach dem "=" Zeichen natürlich kein Wert. Ist aber hierbei unrelevant, weil deine Lösung ja trotzdem den Zweck erfüllt.

Das Array 1 wird ja durch die HL7 Datei gefüllt. Im Array 1 steht dann z.B. "MSH_Position_3=WERT1"
Das Array 2 wird durch die .ini-Datei befüllt. Im Array 2 steht dann z.B. "MSH_Position_3="

Es muss nun also ein Array 3 erzeugt werden, dass letztlich jeweils den Wert von Array 1 an den Key von Array 2 anhängt.
Wie kann ich denn mit "Compare-Object" sagen.... "add...??", dass das Eine an das Andere angehängt wird.
Member: sklchris
sklchris Jul 15, 2020 at 10:28:37 (UTC)
Goto Top
Dann muss es aber an Dir liegen, also ich habs nur überflogen und er sucht wenn ich es richtig verstanden habe, eine Lösung wie das Script anspringt, sobald eine neue oder geänderte Datei in dem Ordner abgelegt wird