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."
Auszug aus der .ini-Datei
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
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 328899
Url: https://administrator.de/contentid/328899
Ausgedruckt am: 25.11.2024 um 09:11 Uhr
10 Kommentare
Neuester Kommentar
Filesystemwatcher lautet das Stichwort
VBA - VBS : Umbennen und Verschieben von Dateien in Loop
Dazu braucht man aber keinen "Experten" . Besser wäre es, du würdest deine Titel aussagekräftiger gestalten.
Gruß
VBA - VBS : Umbennen und Verschieben von Dateien in Loop
Dazu braucht man aber keinen "Experten" . Besser wäre es, du würdest deine Titel aussagekräftiger gestalten.
Gruß
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 zitiereTja, 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.
"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.
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*"}
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.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?
Dazu musst du es [ordered] erstellen
$dict = [ordered]@{}
https://blogs.technet.microsoft.com/heyscriptingguy/2014/09/30/use-power ...