internet2107
Goto Top

Powershell - HL7 - Export nach CSV

Folgendes Problem.
Es geht um das Einlesen einer HL7 Datei, die zu einer CSV-Datei exportiert/umgewandelt werden soll.

Die einzulesende HL7-Datei sieht so aus.
MSH|^~\&|LAM|ATEST|BTEST|CTEST|201612230908||ORM^O01||P|2.4
PID|||0080012103||SC02^Lab Integration||19750501|M
PV1|||LAB||||||||||||||||00000504970000


Endergebnis soll sein, dass die von HL7 zu CSV umgewandelte Datei so aussieht:
F_STUDYNAM;F_BARCODE;F_SCREENNO;F_SUBJECT;F_PERIOD;F_TIMECODE;F_SAMPTYPE;F_LBLCODE;F_EXTSAMP
1234;1234750001;;RNR001;Per 1;00:00:00;PK sample;;
Lab Integration;0080012103;;SC02;201612230908;00000504970000;;

Bisher bin ich soweit, dass ich die HL7 einlesen kann, aus einem Ordner mit ggf. mehreren Dateien.
Wo ich aktuell noch Probleme habe, ist das Umwandeln, der Export nach CSV.


Meine Fehler sind aktuell noch:

1) Der Export nach csv klappt zwar soweit, jedoch schreibt er den Header nicht in die erste Zeile?

2) Er sind immer neue Zeilen vorhanden
die csv-Datei sieht aktuell so aus

IST-Zustand
"SC02^Lab Integration"  
"0080012103"  

SOLL-Zustand
F_STUDYNAM;F_BARCODE;F_SCREENNO;F_SUBJECT;F_PERIOD;F_TIMECODE;F_SAMPTYPE;F_LBLCODE;F_EXTSAMP
1234;1234750001;;RNR001;Per 1;00:00:00;PK sample;;
Lab Integration;0080012103;;SC02;201612230908;00000504970000;;

3) Das "^" Zeichen müsste als "|" umgewandelt werden, sodass ein weiteres Feld entsteht.


Kann mir hier jemand Tipps geben?

Hier mein bisheriger Code. Bitte von der einen, oder anderen zusätzlichen Zeile nicht verwirren lassen, da sie später auch Bedeutungen haben soll.

$filesIN = "C:\temp\HL7Messages\*.HL7"  

# Outputfile
$fileOUT = "C:\temp\HL7_csv\final.csv"  

$src = (Get-ChildItem $filesIN)[1].FullName

$search_name1 = ""  
$search_name2 = ""  
$search_name3 = ""  
$search_name4 = ""  


# take hl7 message as string, convert to posh obj
function hl7-to-object {
    param($src)
    # go from hl7 to powershell array of objects
    $msg = @()
    $cursorCount = 0
    $src | Foreach {
        $split = $_.Split("|")  
        
        $nodeName = $split
        
        $properties = @()
        $split | select -skip 1 | foreach {    
            $properties += $_
        }
        
        $object = New-Object psobject
        $object | Add-Member –membertype noteproperty –Name HL7Pos –Value $cursorCount
        $object | Add-Member –membertype noteproperty –Name Segment –Value $nodeName
        $object | Add-Member –membertype noteproperty –Name Fields –Value $properties
        
        $msg += $object

        $cursorCount += 1
    }
    return $msg 
}

# take posh object formed from hl7 and convert to hl7 string
function object-to-hl7 {
    param($msgObj)
    # convert back to HL7
    $msgSrc = @()
    $msgObj | foreach {
        $msgSrc += $_.Segment + "|" + ($_.Fields -join "|")   
    }
    return ($msgSrc -join "`r`n")  
}


$msg = hl7-to-object((get-content $src))

$MSH = ($msg | where {$_.Segment -eq "MSH"} | select -First 1)  

$PV1_B = ($msg | where {$_.Segment -eq "PV1"} | select -Skip 1)  

#$PV1_B.HL7Pos
($msg | where {$_.HL7Pos -eq $PV1_B.HL7Pos} | select -First 1)

(Get-ChildItem $filesIN) | foreach {

$MSH_output1 = (($msg | where {$_.Segment -eq "MSH"} | select -First 1).Fields[1])   
$MSH_output2 = (($msg | where {$_.Segment -eq "MSH"} | select -First 1).Fields[2])  
$MSH_output3 = (($msg | where {$_.Segment -eq "MSH"} | select -First 1).Fields[3])  
$MSH_output4 = (($msg | where {$_.Segment -eq "MSH"} | select -First 1).Fields[4])  
$MSH_output5 = (($msg | where {$_.Segment -eq "MSH"} | select -First 1).Fields[5])  
$MSH_output6 = (($msg | where {$_.Segment -eq "MSH"} | select -First 1).Fields[6])  
$MSH_output7 = (($msg | where {$_.Segment -eq "MSH"} | select -First 1).Fields[7])  
$MSH_output8 = (($msg | where {$_.Segment -eq "MSH"} | select -First 1).Fields[8])  
$MSH_output9 = (($msg | where {$_.Segment -eq "MSH"} | select -First 1).Fields[9])  
$MSH_output10 = (($msg | where {$_.Segment -eq "MSH"} | select -First 1).Fields[10])  

$PID_output1 = (($msg | where {$_.Segment -eq "PID"} | select -First 1).Fields[2])  
$PID_output2 = (($msg | where {$_.Segment -eq "PID"} | select -First 1).Fields[3])  
$PID_output3 = (($msg | where {$_.Segment -eq "PID"} | select -First 1).Fields[4])  
$PID_output4 = (($msg | where {$_.Segment -eq "PID"} | select -First 1).Fields[5])  
$PID_output5 = (($msg | where {$_.Segment -eq "PID"} | select -First 1).Fields[6])  

$PV1_output1 = (($msg | where {$_.Segment -eq "PV1"} | select -First 1).Fields[2])  
$PV1_output2 = (($msg | where {$_.Segment -eq "PV1"} | select -First 1).Fields[3])  


    $msg = hl7-to-object((get-content $_))
    $isSearch_Name1 = ($msg | where {($_.Segment -eq "PID") -and ($_.Fields[4] -like "*$search_name1*")} | select -First 1)  
    if($isSearch_Name1 -eq $null) {
        write-host "Suchname $search_name1 nicht gefunden"  
    } else {
        write-host "Suchname $search_name1 gefunden"  
    }
    
$header = "F_STUDYNAM;F_BARCODE;F_SCREENNO;F_SUBJECT;F_PERIOD F_TIMECODE;F_SAMPTYPE;F_LBLCODE;F_EXTSAMP"  

$arr = @(); $arr +=$header; $arr +=$PID_output3; $arr +=$PID_output1
write-host $arr
# Objekt aus Inhalt erstellen
$obj = $arr | ConvertFrom-Csv -Delimiter ","   

# Export in CSV
$obj | ConvertTo-Csv -Delimiter ";" -NoTypeInformation | select -Skip 1 | Set-Content $fileOUT  


}

Content-ID: 328122

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

Ausgedruckt am: 25.11.2024 um 09:11 Uhr

132272
132272 01.02.2017 aktualisiert um 15:46:46 Uhr
Goto Top
Zitat von @internet2107:
Meine Fehler sind aktuell noch:

1) Der Export nach csv klappt zwar soweit, jedoch schreibt er den Header nicht in die erste Zeile?
Naja, wenn man
select -Skip 1
in Zeile 102 einbaut, kein Wunder face-big-smile! Hier reicht dann stattdessen auch ein einfaches Export-CSV wenn man schon ein Object hat.

3) Das "^" Zeichen müsste als "|" umgewandelt werden, sodass ein weiteres Feld entsteht.
Stichwort .Replace('^','|')

Hier mein bisheriger Code.
Muss ich jetzt nicht alles lesen, hast du ja anscheinend auch nicht :-P ... das kann von mir aus gerne jemand anderes machen.

Gruß