none
Den ersten und letzten Eintrag einer Identnummer aus einer CSV wiedergeben RRS feed

  • Frage

  • Hallo zusammen,

    ich hab folgendes Problem und hoffe, dass Ihr mir einen Lösungsansatz (oder den Weg dorthin) aufzeigen könnt, denn aktuell habe ich leider gar keinen Ansatz :-(

    Ich möchte unser Projektmanagement-Tool mit Daten aus der Zeiterfassung füttern. Dafür benötige ich das erste Kommen und das letzte Gehen jeder Person und muss zusätzlich die Dienstgänge raus rechnen.

    Die Zeiterfassung gibt pro Zeile ein Buchungspärchen (Kommen&Gehen) pro Personalnummer und Datum raus.
    Hier habe ich also immer unterschiedlich viele Zeilen pro Person und Datum - je nachdem wie oft die Person zur Pause gegangen ist.

    Mich interessiert aber, nur das erste Kommen und das letzte Gehen, aus dem Beispiel (siehe unten):

    1234;04.04.2018;08:00;16:30;

    5678;04.04.2018;08:00;18:00;

    1234;05.04.2018;08:00;17:22;

    Und der Dienstgang (Dienstgangbuchungen sind immer mit einem DG nach der Uhrzeit gekennzeichnet):

    1234;05.04.2018;10:00 DG;11:00 DG

    Beispiele aus der CSV:

    Personalnr;Datum;Kommen;Gehen

    1234;04.04.2018;08:00;12:00;

    1234;04.04.2018;12:30;16:30;

    ...

    5678;04.04.2018;08:00;09:00;

    5678;04.04.2018;09:20;12:30;

    5678;04.04.2018;13:00;18:00;

    ...

    1234;05.04.2018;08:00;10:00 DG;

    1234;05.04.2018;11:00 DG;13:00;

    1234;05.04.2018;13:30;14:22;

    1234;05.04.2018;14:42;15:52;

    1234;05.04.2018;16:07;17:22;

    Habt ihr eine Idee? Vielen lieben Dank.

    Beste Grüße aus Hannover

    Rouven

    Donnerstag, 5. April 2018 07:27

Antworten

  • Hi,

    mir kommt folgendes in den Sinn:
    Bau dir eine Liste, bestehen aus allen Personalnummern.

    Für jede Personalnummer in der Personalnummernliste (foreach $Datensatz in $Array) kannst Du dann in deinem Array, welches die CSV der Zeiterfassung hält, nach Datensätzen suchen (where-object), die die Personalnummer und das gewünschte Datum haben. 

    Als Folge hättest Du Variablen, die für jeden Mitarbeiter für jeden beliebigen Tag alle Zeiteinträge beliebig sortiert beinhalten. Mit der Sortierung (sort-object) sortierst Du nach Kommen oder Gehen, und kannst dann jeweils den ersten oder letzten Datensatz selektieren (select -first 1 | select -last 1) und dir jeweils Kommen und Gehen ausgeben lassen und wegspeichern.

    MfG, Jannik

    Donnerstag, 5. April 2018 10:59
  • Hallo Rouven,

    also erstmal Willkommen im deutschen Powershell Forum. 

    Wie Du bestimmt in den Forenregeln und den hilfreichen Hinweisen am Anfang des Forums gelesen hast, schreiben wir keinen gebrauchsfertigen Code auf Anfrage. Solltest Du also noch keine  Erfahrungen mit Powershell haben, lautet die dringende Empfehlung, Dir als erstes die Grundlagen der Powershell anzueignen. Das geht auch kostenlos zum Beispiel mit einem sehr empfehlenswerten Video-Kurs der Microsoft Virtual Academy - Getting started with Windows Powershell. Oder Du besorgst Dir ein gutes Einsteiger-Buch.

    Wenn Du bereits selbstgeschriebenen Code hast und dabei Hilfe brauchst, kannst Du den hier gerne posten und wir werden nach Kräften versuchen Dir zu helfen (Code bitte als solchen formatieren!  :-)  )

    Na dann viel Spaß und viel Erfolg!

    Edit: ... fast hätte ich's vergessen . solltest Du schon ein wenig Erfahrung mit Scripting in Powereshell haben und brauchst nur einen Schubs in die richtige Richtung - für Deine Aufgabe könntest Du eventuell mit den cmdlets Import-CSV und Group-Object anfangen. Fast immer hilfreich sind auch Select-Object, Where-Object und die Comparison Operators. ;-)


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 5. April 2018 08:53

Alle Antworten

  • Hallo Rouven,

    also erstmal Willkommen im deutschen Powershell Forum. 

    Wie Du bestimmt in den Forenregeln und den hilfreichen Hinweisen am Anfang des Forums gelesen hast, schreiben wir keinen gebrauchsfertigen Code auf Anfrage. Solltest Du also noch keine  Erfahrungen mit Powershell haben, lautet die dringende Empfehlung, Dir als erstes die Grundlagen der Powershell anzueignen. Das geht auch kostenlos zum Beispiel mit einem sehr empfehlenswerten Video-Kurs der Microsoft Virtual Academy - Getting started with Windows Powershell. Oder Du besorgst Dir ein gutes Einsteiger-Buch.

    Wenn Du bereits selbstgeschriebenen Code hast und dabei Hilfe brauchst, kannst Du den hier gerne posten und wir werden nach Kräften versuchen Dir zu helfen (Code bitte als solchen formatieren!  :-)  )

    Na dann viel Spaß und viel Erfolg!

    Edit: ... fast hätte ich's vergessen . solltest Du schon ein wenig Erfahrung mit Scripting in Powereshell haben und brauchst nur einen Schubs in die richtige Richtung - für Deine Aufgabe könntest Du eventuell mit den cmdlets Import-CSV und Group-Object anfangen. Fast immer hilfreich sind auch Select-Object, Where-Object und die Comparison Operators. ;-)


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 5. April 2018 08:53
  • Hi, 

    vielen Dank für deine Antwort. 

    Ich habe erste Erfahrung mit Import-CSV gesammelt, aber stehe sicherlich noch ganz am Anfang meiner Reise mit Powershell - daher vielen Dank für die Links.

    Einen von euch geschrieben Code möchte ich auch nicht haben, ich möchte mir das schon selber aneignen und daraus lernen. Der Schubs in die richtige Richtung tut daher sehr gut, ich werde dort mal weiter einsteigen - auch hier vielen Dank für die Tipps und Links.

    Beste Grüße aus Hannover

    Rouven

    Donnerstag, 5. April 2018 10:47
  • Du musst erstmal rausfinden wie man eine CSV als CSV einliest und einzelne Teile dann weiterverarbeitet. Dann gruppierst du die Daten nach Personalnummer. Tageszeiten lassen sich als Datetime-Objekte mit Powershell vergleichen wie Zahlen (später = größer, früher = kleiner) bzw. sortieren.So kannst du sehr einfach die jeweils erste und letzte geloggte Zeit rausfinden.

    Noch einen kleinen, völlig Un-Powershelligen Nebentipp: Hast du deine Idee mit eurem Datenschutzbeauftragten abgesprochen? Zeiterfassungsdaten sind geschützte personenbezogene Daten. Da kann man sehr schnell in Teufelsküche kommen.


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Donnerstag, 5. April 2018 10:48
    Moderator
  • Hi,

    mir kommt folgendes in den Sinn:
    Bau dir eine Liste, bestehen aus allen Personalnummern.

    Für jede Personalnummer in der Personalnummernliste (foreach $Datensatz in $Array) kannst Du dann in deinem Array, welches die CSV der Zeiterfassung hält, nach Datensätzen suchen (where-object), die die Personalnummer und das gewünschte Datum haben. 

    Als Folge hättest Du Variablen, die für jeden Mitarbeiter für jeden beliebigen Tag alle Zeiteinträge beliebig sortiert beinhalten. Mit der Sortierung (sort-object) sortierst Du nach Kommen oder Gehen, und kannst dann jeweils den ersten oder letzten Datensatz selektieren (select -first 1 | select -last 1) und dir jeweils Kommen und Gehen ausgeben lassen und wegspeichern.

    MfG, Jannik

    Donnerstag, 5. April 2018 10:59
  • Vielen Dank für den Tip, Denniver.

    Mit unserem Datenschutzbeauftragten habe ich bereits gesprochen. Hier habe ich vorläufig grünes Licht bekommen, aber ich darf die Schnittstelle nochmal vorstellen sobald sie funktionsfähig ist.

    Donnerstag, 5. April 2018 15:04
  • Hi Jannik, 

    auch dir vielen Dank für deine Idee und die Inspiration. Dann werde ich mich mal ans Werk machen und mich schlau lesen und mal ein wenig in die Tasten hauen =)

    VG

    Rouven

    Donnerstag, 5. April 2018 15:07