makroll10
Goto Top

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

Content-ID: 6391471419

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

Ausgedruckt am: 22.11.2024 um 18:11 Uhr

Uhli90
Lösung Uhli90 16.03.2023 um 13:42:28 Uhr
Goto Top
Hier ein kleiner Denkanstoß:

$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.
TK1987
Lösung TK1987 16.03.2023 um 14:32:50 Uhr
Goto Top
Moin,

# 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
makroll10
Lösung makroll10 16.03.2023 um 17:52:06 Uhr
Goto Top
Genial... Das war die Lösung für mein konkretes "Problem"...

Vielen Dank....face-wink