PowerShell CSV-Datei in bestimmtes Format umwandeln
Hallo Zusammen,
Der Inhalt einer CSV-Datei soll in eine Matrix überführt werden.
Leider komme ich mit PowerShell hier nicht weiter. Mit Excel ist es machbar, aber ich möchte es doch lieber komplett in PowerShell bearbeiten.
So sieht meine CSV-Datei aus:
"USER1","APP1 APP4 APP5"
"USER2","APP1 APP2"
"USER3","APP6 APP7"
"USER4","APP3 APP4"
"USER5","APP1 APP9"
"USER6","APP9"
Nun würde ich diese gerne folgendermaßen umwandeln:
LOGIN;APP1;APP2;APP3;APP4;APP5;APP6;APP7;APP8;APP9
"USER1";X;;;X;X;;;;;;
"USER2";X;X;;;;;;;;;
"USER3";;;;;;X;X;;;;
"USER4";;;X;X;;;;;
"USER5";X;;;;;;;;X
"USER6";;;;;;;;;X
Über jede Anregung, wie dies in PowerShell möglich wäre, würde ich mich freuen.
Gruß
Willi
Der Inhalt einer CSV-Datei soll in eine Matrix überführt werden.
Leider komme ich mit PowerShell hier nicht weiter. Mit Excel ist es machbar, aber ich möchte es doch lieber komplett in PowerShell bearbeiten.
So sieht meine CSV-Datei aus:
"USER1","APP1 APP4 APP5"
"USER2","APP1 APP2"
"USER3","APP6 APP7"
"USER4","APP3 APP4"
"USER5","APP1 APP9"
"USER6","APP9"
Nun würde ich diese gerne folgendermaßen umwandeln:
LOGIN;APP1;APP2;APP3;APP4;APP5;APP6;APP7;APP8;APP9
"USER1";X;;;X;X;;;;;;
"USER2";X;X;;;;;;;;;
"USER3";;;;;;X;X;;;;
"USER4";;;X;X;;;;;
"USER5";X;;;;;;;;X
"USER6";;;;;;;;;X
Über jede Anregung, wie dies in PowerShell möglich wäre, würde ich mich freuen.
Gruß
Willi
Please also mark the comments that contributed to the solution of the article
Content-Key: 374375
Url: https://administrator.de/contentid/374375
Printed on: April 27, 2024 at 16:04 o'clock
8 Comments
Latest comment
Nabend.
Versuch es mal hiermit:
Was Du anpassen musst, sind die Pfade für die CSV-Datein.
z.B.: In der ersten Zeile: "D:\test.csv" & in der letzten Zeile: "D:\new.csv"
Gruß
tfi2013
Versuch es mal hiermit:
Was Du anpassen musst, sind die Pfade für die CSV-Datein.
z.B.: In der ersten Zeile: "D:\test.csv" & in der letzten Zeile: "D:\new.csv"
$CSVToConvert = Get-Content "D:\test.csv" | ConvertFrom-Csv -Header Login,App
$NewCsvLine = "" | Select Login, App1, App2, App3, App4, App5, App6, App7, App8, App9
[Array] $NewCsv = @()
For($i=0; $i -lt $CSVToConvert.Login.Count; $i++){
$SplittedApp = $CSVToConvert.App[$i].Split(" ")
For($j=0; $j -lt $SplittedApp.Count; $j++){
Switch($SplittedApp[$j]){
"APP1" {$NewCsvLine.Login = $CSVToConvert.Login[$i]; $NewCsvLine.App1 = "X"; Break}
"APP2" {$NewCsvLine.Login = $CSVToConvert.Login[$i]; $NewCsvLine.App2 = "X"; Break}
"APP3" {$NewCsvLine.Login = $CSVToConvert.Login[$i]; $NewCsvLine.App3 = "X"; Break}
"APP4" {$NewCsvLine.Login = $CSVToConvert.Login[$i]; $NewCsvLine.App4 = "X"; Break}
"APP5" {$NewCsvLine.Login = $CSVToConvert.Login[$i]; $NewCsvLine.App5 = "X"; Break}
"APP6" {$NewCsvLine.Login = $CSVToConvert.Login[$i]; $NewCsvLine.App6 = "X"; Break}
"APP7" {$NewCsvLine.Login = $CSVToConvert.Login[$i]; $NewCsvLine.App7 = "X"; Break}
"APP8" {$NewCsvLine.Login = $CSVToConvert.Login[$i]; $NewCsvLine.App8 = "X"; Break}
"APP9" {$NewCsvLine.Login = $CSVToConvert.Login[$i]; $NewCsvLine.App9 = "X"; Break}
}
}
$NewCsv = [Array]$NewCsv + $NewCsvLine
$NewCsvLine = "" | Select Login, App1, App2, App3, App4, App5, App6, App7, App8, App9
}
$NewCsv | Select Login, App1, App2, App3, App4, App5, App6, App7, App8, App9 | Export-Csv -Path "D:\new.csv" -Delimiter ";" -NoTypeInformation
Gruß
tfi2013
Servus Willi,
eleganter und ohne feste Zuweisung von Appnamen wäre das hier:
Grüße Uwe
eleganter und ohne feste Zuweisung von Appnamen wäre das hier:
# Eingabedatei
$fileIN = 'D:\apps.csv'
# Ausgabedatei
$fileOUT = 'D:\apps_new.csv'
# =========================
# Import mit neuem Header
$csv = Import-CSV $fileIN -Delimiter ',' -Header 'Login','Raw'
# App Member hinzufügen
$csv | %{$_.Raw.Split(' ').Trim()} | select -Unique | %{$csv | Add-Member -MemberType NoteProperty -Name $_ -Value '' -Force}
# zugehörige Apps zuweisen
foreach($entry in $csv){
$entry.Raw.Split(' ').Trim() | %{$entry.$_ = 'X'}
}
# output
$csv | select -Exclude Raw | export-csv $fileOUT -Delimiter ';' -NoType -Encoding UTF8