ms1982
Goto Top

Powershell Ausgabe Liste in Tabelle konvertieren

Hallo zusammen,

ich habe eine umfangreiche Text Datei die mit Leerzeichen getrennt ist. Diese möchte ich einlesen und nach diversen Werten Filtern.
Klappt auch großteils, nur manchmal sind Werte enthalten, nach denen ich gar nicht suche wie z.B. run_count=1 ; resources_used.cput=

Meine Frage nun bzw. das Problem das ich habe. Wie bekomme ich die Ausgabe in Tabellen Form hin?

ein Format-Table ; export-csv ; set-content habe ich bereits probiert. Hat jemand einen Löösungsansatz?


Beispiel Einzulesende Datei:
04/01/2022 03:51:30 E 3008.servername user=vorname.nachname group=users project=_pbs_project_default jobname=jobname_blabla queue=pt ctime=1648734089 qtime=1648734089 etime=1648755842 start=1648755875 exec_host=cn008/0*24 exec_vnode=(cn008:ncpus=24:mem=196608000kb) Resource_List.mem=192000mb Resource_List.mpiprocs=24 Resource_List.ncpus=24 Resource_List.nodect=1 Resource_List.place=free Resource_List.select=1:ncpus=24:mem=192000mb:mpiprocs=24 Resource_List.software=Software_Name Resource_List.Lizenzen_lic=23 Resource_List.walltime=720:00:00 session=106759 end=1648777890 Exit_status=0 resources_used.cpupercent=0 resources_used.cput=00:00:00 resources_used.mem=944240kb resources_used.ncpus=24 resources_used.vmem=8547500kb resources_used.walltime=06:06:10 eligible_time=00:00:00 run_count=1
04/01/2022 03:52:06 E 3011.servername user=vorname.nachname group=users project=_pbs_project_default jobname=jobname_blabla queue=pt ctime=1648734942 qtime=1648734942 etime=1648777889 start=1648777896 exec_host=cn017/0*24 exec_vnode=(cn017:ncpus=24:mem=196608000kb) Resource_List.mem=192000mb Resource_List.mpiprocs=24 Resource_List.ncpus=24 Resource_List.nodect=1 Resource_List.place=free Resource_List.select=1:ncpus=24:mem=192000mb:mpiprocs=24 Resource_List.software=Software_Name Resource_List.Lizenzen_lic=23 Resource_List.walltime=720:00:00 session=122156 end=1648777926 Exit_status=0 resources_used.cpupercent=0 resources_used.cput=00:00:00 resources_used.mem=257460kb resources_used.ncpus=24 resources_used.vmem=7557688kb resources_used.walltime=00:00:18 eligible_time=00:00:00 run_count=1



Das Skript:
$LIST = Get-Content -Path C:\Temp\april.txt -Delimiter " " | Select-string -Pattern `  
"04/[0-9][0-9]/2022", "[0-9][0-9]:[0-9][0-9]:[0-9][0-9]", "[0-9][0-9][0-9][0-9].servername",   
"jobname=", "user=", "Resource_List.ncpus=", "Resource_List.nodect=", "Resource_List.software=",   
"Exit_status=", "resources_used.mem=", "resources_used.vmem=", "Resource_List.*_lic",   
"resources_used.walltime=", "eligible_time="   
$LIST>C:\Temp\k.txt

Ausgabe:
04/01/2022 
03:51:30 
3008.servername 
user=vorname.nachname 
jobname=Jobname_blabla 
Resource_List.ncpus=24 
Resource_List.nodect=1 
Resource_List.software=Software_Name 
Resource_List.starhpcdomains_lic=23 
Resource_List.walltime=720:00:00 
Exit_status=0 
resources_used.cput=00:00:00 
resources_used.mem=944240kb 
resources_used.vmem=8547500kb 
resources_used.walltime=06:06:10 
eligible_time=00:00:00 
run_count=1


Danke schonmal!

Michael

Content-ID: 3020365342

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

Ausgedruckt am: 24.11.2024 um 19:11 Uhr

3016726741
3016726741 09.06.2022 um 08:36:21 Uhr
Goto Top
Hallöchen!

schau hier mal nach, dass du erst den "einfachen Export" auf deinem Monitor in eine Tabelle bekommst und anschließend dir das dann als csv ausdrucken kannst.

Ausgabe formatieren in PowerShell
ms1982
ms1982 09.06.2022 um 10:58:22 Uhr
Goto Top
Hallo BusterFriendly.

Danke für den Link, den werde ich mir anschauen.

Gruss Michael
3016726741
3016726741 09.06.2022 um 11:37:25 Uhr
Goto Top
gerne doch. Es ist sinniger sich erst die Tabelle im PS ausgeben zu lassen, damit die Formatierungen ganz klar sind, wie du sie anwenden kannst und dann in csv zu exportieren.

PS ist ein sehr mächtiges Tool.
colinardo
Lösung colinardo 12.06.2022 aktualisiert um 13:01:34 Uhr
Goto Top
Servus.
Eine mögliche Variante (Kommentare siehe Code):
# input file
$file = 'C:\Temp\april.txt'  
# output file
$csv = 'C:\temp\output.csv'  
# columns to export
$columns = 'Date',  
           'Servername',  
           'user',  
           'jobname',  
           'Resource_List.ncpus',  
           'Resource_List.nodect',  
           'Resource_List.software',  
           'Resource_List.*_lic',  
           'Resource_List.walltime',  
           'Exit_status',  
           'resources_used.cput',  
           'resources_used.mem',  
           'resources_used.vmem',  
           'resources_used.walltime',  
           'eligible_time'  
# for each line of content
$result = foreach($line in Get-Content $file) {
    # split line by space
    $cols = $line.split(" ")  
    # convert data to hashtable skipping first 4 columns with no column header assignment
    $obj = $cols | select -skip 4 | out-string | ConvertFrom-StringData
    # add missing servername and date columns to hashtable
    $obj.Servername = $cols[3]
    $obj.Date = $cols[0,1] -join ' '  
    # convert hashtable to custom object
    [pscustomobject]$obj
}
# select desired columns and export objects as csv
$result | select $columns | export-csv $csv -Delimiter ";" -NoType -Encoding UTF8  

Ergebnis CSV-Datei:

"Date";"Servername";"user";"jobname";"Resource_List.ncpus";"Resource_List.nodect";"Resource_List.software";"Resource_List.Lizenzen_lic";"Resource_List.walltime";"Exit_status";"resources_used.cput";"resources_used.mem";"resources_used.vmem";"resources_used.walltime";"eligible_time"  
"04/01/2022 03:51:30";"3008.servername";"vorname.nachname";"jobname_blabla";"24";"1";"Software_Name";"23";"720:00:00";"0";"00:00:00";"944240kb";"8547500kb";"06:06:10";"00:00:00"  
"04/01/2022 03:52:06";"3011.servername";"vorname.nachname";"jobname_blabla";"24";"1";"Software_Name";"23";"720:00:00";"0";"00:00:00";"257460kb";"7557688kb";"00:00:18";"00:00:00"  
Grüße Uwe
ms1982
ms1982 13.06.2022 um 12:28:51 Uhr
Goto Top
Hallo Uwe.

Das schaut richtig gut aus!! Danke.

Ich habe meine Methode zwischenzeitlich auch angepasst bzw. daran weitergearbeitet.

Ich habe Zeile 6 durch das ersetzt.
| Set-Content -Path C:\Temp\april2.txt

hinzugefügt
Get-Content -Path C:\Temp\april2.txt | Where-Object {$_ -notlike 'run_count=*'} | Where-Object {$_ -notmatch 'resources_used.cput=*'} | Where-Object {$_ -notmatch 'Resource_List.walltime=*'} | set-content -Path C:\Temp\april3.txt  

und entferne die Zeilen die ich nicht haben möchte raus. Je nach Programm (Solver) steht der wichtige Inhalt in 15 - 17 Spalten oder in 15 - 17 Zeilen. Nicht jedes Programm liefert die entsprechenden Informationen.
Mein offener Punkt, wie bekomme ich die Werte in Spaltenform dargestellt. Ich hoffe ich werde aus deinem Ansatz
etwas adaptieren können. Dein Ansatz übersteigt meine PS Kenntnisse, hierfür werde ich etwas Zeit brauchen.

Nochmals vielen Dank!

Michael