Inhalt einer CSV-Datei von tageweiser Darstellung in zeitraumweise Darstellung umwandeln
Hallo,
ich möchte gerne den Inhalt der Datei: Daten_A.csv per Powershell von einer zeilen- und tageweisen Darstellung in eine zeitraumbezogene Darstellung umwandeln.
Die Ausgabe soll, wie in der Datei: Daten_B.csv dargestellt, jeweils gruppiert nach Personalnummer, Zeitraum und Fehlgrund erfolgen.
Der Zeitraumbeginn soll in die Spalte: Datum-von und das Zeitraumende soll in die Spalte: Datum-bis geschrieben werden.
Daten_A.csv:
Personalnummer;Datum;Fehlgrund
101;01.01.2023;Gleitzeit
101;02.01.2023;Gleitzeit
101;03.02.2023;Gleitzeit
101;06.01.2023;Urlaub
101;07.01.2023;Urlaub
102;05.01.2023;Gleitzeit
102;06.01.2023;Gleitzeit
102;16.02.2023;Freizeit
102;17.02.2023;Gleitzeit
104;20.02.2023;Freizeit
106;13.01.2023;Urlaub
106;14.01.2023;Urlaub
Daten_B.csv:
Personalnummer;Datum-von;Datum-bis;Fehlgrund
101;01.01.2023;02.01.2023;Gleitzeit
101;03.02.2023;03.02.2023;Gleitzeit
101;06.01.2023;07.01.2023;Urlaub
102;05.01.2023;06.01.2023;Gleitzeit
102;16.02.2023;16.02.2023;Freizeit
102;17.02.2023;17.02.2023;Gleitzeit
104;20.02.2023;20.02.2023;Freizeit
106;13.01.2023;14.01.2023;Urlaub
Ich komme diesbezüglich leider nicht weiter und wäre für einen Lösungsansatz sehr dankbar....
VG
Markus
ich möchte gerne den Inhalt der Datei: Daten_A.csv per Powershell von einer zeilen- und tageweisen Darstellung in eine zeitraumbezogene Darstellung umwandeln.
Die Ausgabe soll, wie in der Datei: Daten_B.csv dargestellt, jeweils gruppiert nach Personalnummer, Zeitraum und Fehlgrund erfolgen.
Der Zeitraumbeginn soll in die Spalte: Datum-von und das Zeitraumende soll in die Spalte: Datum-bis geschrieben werden.
Daten_A.csv:
Personalnummer;Datum;Fehlgrund
101;01.01.2023;Gleitzeit
101;02.01.2023;Gleitzeit
101;03.02.2023;Gleitzeit
101;06.01.2023;Urlaub
101;07.01.2023;Urlaub
102;05.01.2023;Gleitzeit
102;06.01.2023;Gleitzeit
102;16.02.2023;Freizeit
102;17.02.2023;Gleitzeit
104;20.02.2023;Freizeit
106;13.01.2023;Urlaub
106;14.01.2023;Urlaub
Daten_B.csv:
Personalnummer;Datum-von;Datum-bis;Fehlgrund
101;01.01.2023;02.01.2023;Gleitzeit
101;03.02.2023;03.02.2023;Gleitzeit
101;06.01.2023;07.01.2023;Urlaub
102;05.01.2023;06.01.2023;Gleitzeit
102;16.02.2023;16.02.2023;Freizeit
102;17.02.2023;17.02.2023;Gleitzeit
104;20.02.2023;20.02.2023;Freizeit
106;13.01.2023;14.01.2023;Urlaub
Ich komme diesbezüglich leider nicht weiter und wäre für einen Lösungsansatz sehr dankbar....
VG
Markus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 6391471419
Url: https://administrator.de/contentid/6391471419
Ausgedruckt am: 22.11.2024 um 18:11 Uhr
3 Kommentare
Neuester Kommentar
Hier ein kleiner Denkanstoß:
Allerdings setzt dieser Code voraus, dass immer die 2 aufeinanderfolgenden Zeilen zusammen gehören. Aber eventuell kommst du so etwas weiter.
Viel Erfolg.
$Daten_A = Import-Csv .\Daten_A.csv -Delimiter ';'
$ResultsArray = @()
$zaehler = 0
ForEach($Daten in $Daten_A){
if ($zaehler -eq 0){
$RA = New-Object PSObject
$RA | Add-Member -type NoteProperty -name "Personalnummer" -Value $Daten.Personalnummer
$RA | Add-Member -type NoteProperty -name "Datum-von" -Value $Daten.Datum
$zaehler = 1
}
else{
$RA | Add-Member -type NoteProperty -name "Datum-bis" -Value $Daten.Datum
$RA | Add-Member -type NoteProperty -name "Fehlgrund" -Value $Daten.Fehlgrund
$ResultsArray += $RA
$zaehler = 0
}
}
$ResultsArray | Sort Personalnummer | Export-Csv .\Daten_B.csv -NoTypeInformation -Delimiter ';'
Allerdings setzt dieser Code voraus, dass immer die 2 aufeinanderfolgenden Zeilen zusammen gehören. Aber eventuell kommst du so etwas weiter.
Viel Erfolg.
Moin,
Gruß Thomas
# Quell- und Zieldatei
$Source = "D:\Daten_A.csv"
$Target = "D:\Daten_B.csv"
# Zusammenhängende Zeitspannen ermitteln
Function Find-TimeSpans {
[CmdletBinding()]Param([parameter(mandatory)][string[]]$DateStrings)
$Dates = Foreach ($Date in $Datestrings){[Datetime]::ParseExact($Date,'dd.MM.yyyy',$Null)}
$i = 0
while ($i -lt $Dates.Count) {
$n = 0
while ($Dates[$i+$n].AddDays(1) -in $Dates) {$n++}
[Array]$TimeSpans += @{Von=$DateStrings[$i]; Bis=$DateStrings[$i+$n]}
$i += $n+1
}
Return $TimeSpans
}
$CSV = Import-CSV -d ';' $Source
$CSV = Foreach ($Data in $CSV |Group Personalnummer,Fehlgrund) {
Foreach ($TimeSpan in Find-TimeSpans $Data.Group.Datum) {
[PsCustomObject][Ordered]@{
Personalnummer = $Data.Group[0].Personalnummer
"Datum-von" = $TimeSpan.von
"Datum-bis" = $TimeSpan.bis
Fehlgrund = $Data.Group[0].Fehlgrund
}
}
}
$CSV | Export-CSV -d ';' $Target -NTI
Gruß Thomas