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-Key: 652533

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

Printed on: April 19, 2024 at 15:04 o'clock

Mitglied: 147669
147669 Feb 16, 2021 at 10:45:34 (UTC)
Goto Top
Guckst du hier, da ist das schon eingebaut face-wink
If-Bedingung in Powershell funktioniert nicht wie erhofft
Member: BonasKorn
BonasKorn Feb 16, 2021 at 11:19:30 (UTC)
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!
Member: Doskias
Doskias Feb 16, 2021 at 11:24:29 (UTC)
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
Mitglied: 147669
147669 Feb 16, 2021 updated at 11:32:05 (UTC)
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. ...
Member: erikro
erikro Feb 16, 2021 at 20:41:23 (UTC)
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