bonaskorn
Goto Top

Daten aus Powershell exportieren

Hallo zusammen

Ich habe ein Script geschrieben, welches Daten aus einem csv- File importiert, diese und diese ändert. Das Script funktioniert soweit einwandfrei und gibt die Daten schön aus. Hier das Script:

clear
$table = Import-Csv -Path 'C:\Temp\Stempelungen\StempelungenJira.csv' -Delimiter ";"  
$counter = 0
$tablelength = $table.count


while ($counter -lt $tablelength) {

    $parts = $table[$counter] -split ';'  
    $name = $parts[4]
    $prename = $parts[5]
    $date = $parts[6]
    $time = $parts[7] 

    $parts2 = $table[$counter + 1] -split ';'  
    $name2 = $parts2[4]
    $prename2 = $parts2[5]
    $date2 = $parts2[6]
    $time2 = $parts2[7]

    $parts3 = $table[$counter + 2] -split ';'  
    $name3 = $parts3[4]
    $prename3 = $parts3[5]
    $date3 = $parts3[6]
    $time3 = $parts3[7]

    $parts4 = $table[$counter + 3] -split ';'  
    $name4 = $parts4[4]
    $prename4 = $parts4[5]
    $date4 = $parts4[6]
    $time4 = $parts4[7]
    
    $parts5 = $table[$counter + 4] -split ';'  
    $name5 = $parts5[4]
    $prename5 = $parts5[5]
    $date5 = $parts5[6]
    $time5 = $parts5[7]

    $parts6 = $table[$counter + 5] -split ';'  
    $name6 = $parts6[4]
    $prename6 = $parts6[5]
    $date6 = $parts6[6]
    $time6 = $parts6[7]
   
    $name=$name -replace 'Name='  
    $name2=$name2 -replace 'Name='  
    $name3=$name3 -replace 'Name='  
    $name4=$name4 -replace 'Name='  
    $name5=$name5 -replace 'Name='  
    $name6=$name6 -replace 'Name='  
    $prename=$prename -replace 'Vorname='  
    $prename2=$prename2 -replace 'Vorname='  
    $prename3=$prename3 -replace 'Vorname='  
    $prename4=$prename4 -replace 'Vorname='  
    $prename5=$prename5 -replace 'Vorname='  
    $prename6=$prename6 -replace 'Vorname='  
    $date=$date -replace 'Stempeldatum='  
    $date2=$date2 -replace 'Stempeldatum='  
    $date3=$date3 -replace 'Stempeldatum='  
    $date4=$date4 -replace 'Stempeldatum='  
    $date5=$date5 -replace 'Stempeldatum='  
    $date6=$date6 -replace 'Stempeldatum='  
    $time=$time -replace 'Zeit='  
    $time2=$time2 -replace 'Zeit='  
    $time3=$time3 -replace 'Zeit='  
    $time4=$time4 -replace 'Zeit='  
    $time5=$time5 -replace 'Zeit='  
    $time6=$time6 -replace 'Zeit='  
    
    $calc = ([datetime]$time2)  - ([datetime] $time)
    $calc2 = (([datetime] $time2)  - ([datetime] $time)) + (([datetime] $time4)  - ([datetime] $time3))
    $calc3 = (([datetime] $time2)  - ([datetime] $time)) + (([datetime] $time4)  - ([datetime] $time3)) + (([datetime] $time6)  - ([datetime] $time5))
    

    if ($name -eq $name3 -and $name3 -eq $name5 -and $date -eq $date3 -and $date3 -eq $date5 -and $prename -eq $prename3 -and $prename3 -eq $prename5) {

        write-host "Name = $name";"Vorname = $prename";"Stempeldatum = $date";"Zeit = $calc3"  

        $counter = $counter + 6

        
    }

    elseif ($name -eq $name3 -and $date -eq $date3 -and $prename -eq $prename3) {

        write-host "Name = $name";"Vorname = $prename";"Stempeldatum = $date";"Zeit = $calc2"  

        $counter = $counter + 4

        
    }
    
    elseif ($name -eq $name2 -and $prename -eq $prename2 -and $date -eq $date2) {

        write-host "Name = $name";"Vorname = $prename";"Stempeldatum = $date";"Zeit = $calc"  

        $counter = $counter + 2

        
    }

    else{

        $counter = $counter + 1


    }
    
}

Das csv-File sieht ist so Aufgebaut:

x;x;x;x;Name;Vorname;Datum;Zeit;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;08:00;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;11:00;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;12:00;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;17:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;07:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;12:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;12:30;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;16:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;17:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;18:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;07:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;11:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;12:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;17:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;07:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;12:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;12:30;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;16:00;x;x;x;x;x

Das Script liest nun jede Zeile aus, berechnet die tägliche Gesamtarbeitszeit für jede Person und gibt dies dann in der Shell aus:
Name = Walker
Vorname = John
Stempeldatum = 13.01.21
Zeit = 08:00:00
Name = Walker
Vorname = John
Stempeldatum = 14.01.21
Zeit = 10:00:00

Nun möchte ich diese Daten in ein neues csv-File abspeichern, weiss aber nicht wie ich das hinbekomme. Auch wäre es schön es so hinzubekommen, dass es am Schluss wieder so abgespeichert wird:

Name;Vorname;Datum;Zeit
Walker;John;13.01.21;08:00:00
Walker;John;14.01.2021;10:00:00


Bei Fragen oder fehlenden Infos meldet euch gerne und danke schonmal im Voraus!

Content-ID: 652533

Url: https://administrator.de/forum/daten-aus-powershell-exportieren-652533.html

Ausgedruckt am: 23.04.2025 um 03:04 Uhr

147669
147669 16.02.2021 um 11:45:34 Uhr
Goto Top
Guckst du hier, da ist das schon eingebaut face-wink
If-Bedingung in Powershell funktioniert nicht wie erhofft
BonasKorn
BonasKorn 16.02.2021 um 12:19:30 Uhr
Goto Top
Da das ganze für ein Schulprojekt ist, würde ich gerne mein eigenes Script verwenden, auch wenn es unnötig aufwendig ist. Ich muss dem Lehrer schliesslich auch erklären können was ich da gemacht habe.

Trotzdem danke für den Vorschlag!
Doskias
Doskias 16.02.2021 um 12:24:29 Uhr
Goto Top
Zitat von @BonasKorn:

Da das ganze für ein Schulprojekt ist, würde ich gerne mein eigenes Script verwenden, auch wenn es unnötig aufwendig ist. Ich muss dem Lehrer schliesslich auch erklären können was ich da gemacht habe.

Trotzdem danke für den Vorschlag!

Schonmal bei google nach "export csv powershell" gesucht? Der Link hier scheint mir brauchbar für dich zu sein:
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

Und ja ich könnte dir den Fertigen Code geben, aber du sollst ja nicht nur dem Lehrer erklären was du gemacht hast, sondern auch was dabei lernen und es verstehen face-smile

Gruß
Doskias
147669
147669 16.02.2021 aktualisiert um 12:32:05 Uhr
Goto Top
Du musst nur aus deinen Daten ein "Objekt" machen dann kannst du es direkt an Export-CSV leiten.
$daten = [pscustomobject]@{
    'Name' = $variable1  
    'Vorname' = $variable2  
    # usw.
}
$daten | export-csv .\daten.csv -Delimiter ";" -NoType -Encoding UTF8  
Ab und zu auch mal die Doku lesen hilft ungemein...
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
erikro
erikro 16.02.2021 um 21:41:23 Uhr
Goto Top
Moin,

Zitat von @BonasKorn:
Ich habe ein Script geschrieben, welches Daten aus einem csv- File importiert, diese und diese ändert. Das Script funktioniert soweit einwandfrei und gibt die Daten schön aus. Hier das Script:

clear
> $table = Import-Csv -Path 'C:\Temp\Stempelungen\StempelungenJira.csv' -Delimiter ";"  
> $counter = 0
> $tablelength = $table.count
> 
> 
> while ($counter -lt $tablelength) {
> 
>     $parts = $table[$counter] -split ';'  
>     $name = $parts[4]
>     $prename = $parts[5]
>     $date = $parts[6]
>     $time = $parts[7] 

Um aller Götter der IT Willen, was treibst Du da??? face-wink Das ist vollkommen unnötig und überhaupt nicht objektorientiert. So sieht das aus:

#Hier steht der Name drin
$table[$counter].Name
#Hier der Vorname
$table[$counter].Vorname
#usw.

Damit ist diese Unsinn auch nicht mehr notwendig:

>     $name=$name -replace 'Name='  
>     $name2=$name2 -replace 'Name='  
> [...]
> 

Und wieso rechnest Du Dinge aus, die Du evtl. gar nicht brauchst? Die Berechnung gehört in das if-Statement

 $calc = ([datetime]$time2)  - ([datetime] $time)
>     $calc2 = (([datetime] $time2)  - ([datetime] $time)) + (([datetime] $time4)  - ([datetime] $time3))
>     $calc3 = (([datetime] $time2)  - ([datetime] $time)) + (([datetime] $time4)  - ([datetime] $time3)) + (([datetime] $time6)  - ([datetime] $time5)) 

    if ($name -eq $name3 -and $name3 -eq $name5 -and $date -eq $date3 -and $date3 -eq $date5 -and $prename -eq $prename3 -and $prename3 -eq $prename5) {
> 
>         write-host "Name = $name";"Vorname = $prename";"Stempeldatum = $date";"Zeit = $calc3"  
> 
>         $counter = $counter + 6
    
> }

$table = Import-Csv -Path 'C:\Temp\Stempelungen\StempelungenJira.csv' -Delimiter ";"  
$counter = 0

while($counter -lt $$table.count) {
if ($table[$counter].Name -eq $table[$counter + 2].Name -and $table[$counter + 2].Name -eq $table[$counter + 4].Name -and $table.[$counter].Datum - eq $table.[$counter + 2].Datum -and $table.[$counter+2].Datum -eq $table.[$counter +4].Datum) {

$calc = ...

} 

Den Rest überlasse ich Dir. face-wink Wie man das dann in ein neues CSV schreibt, hat Dir ja schon @147669 verraten. Eine kleine Ergänzung. Ans Ende muss noch -append, damit die Datei nicht bei jedem Datensatz überschrieben wird.

Damit Du das alles verstehst, ein wenig Lektüre aus meiner Linksammlung:
https://www.linetwork.de/powershell-import-export-csv/
https://www.windowspro.de/script/csv-dateien-powershell-erstellen-sortie ...
https://www.msxfaq.de/code/powershell/pscsv.htm
https://adamtheautomator.com/import-csv/

hth

Erik