2016-12-19 5 views
1

Aufbauend auf my previous question (dank @MartinBrandl), würde Ich mag die Zeitwerte greifen Zeit als auch zu berechnen.berechnen Zeit aus dem Dokument

Beispieldaten:

07:30 - 07:45PMTS09526052 | Sev9 | Location| | Due: 12/23/2016 
NON PC HARDWARE - TROUBLESHOOT SW 
Complete this Job 

Martin Brandl kam mit dieser zu den anderen Daten, die ich brauche zu bekommen:

Select-String $WLDir -pattern '(PMT[S|T]\d{8})' -Context 0,2 | ForEach-Object { 
[PSCustomObject]@{ 
    Time = $_.Matches.Groups[1].Value 
    Topic = $_.Context.PostContext[0] 
    Status = $_.Context.PostContext[1] 
} 
} | ConvertTo-Csv -NoTypeInformation 

Ich möchte von rechts vor dem PMT Teil des 07:30 - 07:45 Bit greifen . Ich plane, diese zu verwenden, um die Zeit zu bekommen:

$StartTime = [However I get the `7:30` here] 
$EndTime = [However I get the `7:45` here] 
$ElapsedTime = (NEW-TIMESPAN –Start $StartTime –End $EndTime).TotalHours 

und ich würde ein viertes Feld zum CSV hinzufügen:

Elapsed = $ElapsedTime 

Aber ich bin nicht sicher, wie speziell die beiden Zeiten zu packen und isoliere sie als Variablen. Kann jemand helfen?

+0

' '(PMT [S | T] \ d {8})'' -> ' '(\ d {2}: \ d {2}) - (\ d {2}: \ d {2}) (PMT [S | T] \ d {8}) '' und passen Sie die Gruppennummern entsprechend an. –

+0

@AnsgarWiechers wie immer, danke.Ich bin mir nicht sicher, was wir hier machen. Wenn du mir sagst, ich solle '' (PMT [S | T] \ d {8}) ''durch'' ersetzen (\ d {2}: \ d {2}) - (\ d {2}: \ d {2}) (PMT [S | T] \ d {8}) ''das ersetzt das erste Feld mit nur der Startzeit. Ich möchte mir die Zeit nehmen, um die verstrichene Zeit zu berechnen und sie in ein anderes Feld in der CSV-Datei einfügen. Ich brauche immer noch die PMT im Feld "Zeit". Ich brauche die berechnete Zeit, um ein eigener Eintrag in der CSV zu sein. – Nate

+0

Die Klammern in den regulären Ausdrücken definieren Erfassungsgruppen, mit denen Sie auf die erfassten Gruppen als '$ _. Matches.Groups []' verweisen können. Index 1 gibt Ihnen die Startzeit, so erhalten Sie die Endzeit von Index ... –

Antwort

2

In Ihrer ersten Frage war die Zeitspanne nicht in der Csv , da es nicht von der RegEx verwiesen wurde. Nun ist es und 7:30 sein $ matches.groups [1] .value usw.

$WLDir = ".\File.txt" 
$Pattern='(\d{2}:\d{2}) - (\d{2}:\d{2})(PMT[S|T]\d{8})' 
Select-String $WLDir -pattern $Pattern -Context 0,2 | 
    ForEach-Object { 
     $StartTime=[datetime]::ParseExact($_.Matches.Groups[1].Value,"HH:mm",$null) 
     $EndTime=[datetime]::ParseExact($_.Matches.Groups[2].Value,"HH:mm",$null) 
     $ElapsedTime = (NEW-TIMESPAN –Start $StartTime –End $EndTime).TotalHours 
     [PSCustomObject]@{ 
      Time = $_.Matches.Groups[3].Value 
      Topic = $_.Context.PostContext[0] 
      Status = $_.Context.PostContext[1] 
      ElapsedHrs = $ElapsedTime 
     } 
} | ConvertTo-Csv -NoTypeInformation 

Geben Sie diesen Ausgang (I einen zweiten testentry mit pMtt hinzugefügt)

"Time","Topic","Status","ElapsedHrs" 
"PMTS09526052","NON PC HARDWARE - TROUBLESHOOT SW","Complete this Job","0,25" 
"PMTT10952605","NON PC HARDWARE - TROUBLESHOOT SW","Complete this Job","0,25" 

Die Säule Zeit noch doesn ‚t die Zeit enthält (meine locale hat ein Komma)

1

Ansgar Wiechers die entscheidenden Hinweise in den Kommentaren zu der Frage zur Verfügung gestellt (Hinzufügen Einfanggruppen (\d{2}:\d{2}) zu dem regulären Expres sion erfaßt wie 07:30 Zeit Strings) und LotPing's helpful answer fleshed sie zu einer Arbeitslösung aus, den Code direkt Nates Arbeit macht.

Lassen Sie mich eine kurze Alternative bieten, die Powershell-Typ-Beschleuniger und Gießen verwendet:

Select-String $WLDir -pattern '(\d{2}:\d{2}) - (\d{2}:\d{2})(PMT[ST]\d{8})' -Context 0,2 | 
    ForEach-Object { 
     [pscustomobject] @{ 
      Time = $_.Matches.Groups[3].Value 
      Topic = $_.Context.PostContext[0] 
      Status = $_.Context.PostContext[1] 
      Elapsed = (
      [datetime] $_.Matches.Groups[2].Value - [datetime] $_.Matches.Groups[1].Value 
      ).TotalHours 
     } 
    } | ConvertTo-Csv -NoTypeInformation $OutFile 
  • Casting die Zeit Strings über die ersten 2 -Abscheidung Gruppen erfasst ($_.Matches.Groups[1].Value und $_.Matches.Groups[2].Value) zu [datetime] wandelt sie in [datetime] (System.DateTime) Instanzen, dessen Zeitanteils spiegelt die angegebene Tageszeit (und deren Datum Teil standardmäßig heute).

  • Sie können direkt eine [datetime] Instanz von einem anderen subtrahieren, um die Zeitspanne zwischen ihnen zu bekommen: das Ergebnis ist ein Beispiel [timespan] (System.TimeSpan) ist, deren .TotalHours Eigenschaft kann dann zugegriffen werden.

zu beachten, dass die Lösung setzt voraus, dass PM-Werte in 24-Stunden-Format dargestellt werden (beispielsweise 15.00 Uhr muß 15:00 dargestellt werden).

+1

Danke, dass ich meine Antwort vereinfacht habe. Ich habe es versucht und es scheint, dass ich einen Fehler hatte, also habe ich den langen Weg genommen. – LotPings

+0

@LotPings. Danke für die Rückmeldung. Alles in allem blieb Ihre Lösung näher bei Nates eigenem Versuch, was auch hilfreich ist. – mklement0

Verwandte Themen