【问题标题】:i want a powershell script from which i extract few lines from csv file to another csv and calculate entire column time values我想要一个 powershell 脚本,从中我从 csv 文件中提取几行到另一个 csv 并计算整个列时间值
【发布时间】:2022-10-23 16:16:48
【问题描述】:

这是我在 csv 文件中的数据

"Day","Person","Start","End","Elapsed"
"2022-10-12","121   ","08:03","18:04","10h, 01m, 06s"
"2022-10-12","sajjad   ","15:38","22:59","07h, 21m, 22s"
"2022-10-13","121   ","08:06","18:25","10h, 19m, 09s"
"2022-10-13","sajjad   ","08:37","16:02","07h, 24m, 51s"
"2022-10-13","128   ","08:27","17:33","09h, 06m, 34s"
"2022-10-13","140   ","09:02","09:03","00h, 01m, 08s"
"2022-10-17","114   ","08:12","14:58","06h, 46m, 37s"
"2022-10-17","sajjad   ","14:08","23:57","09h, 48m, 40s"
"2022-10-17","128   ","08:30","12:23","03h, 53m, 34s"
"2022-10-17","133   ","08:17","08:19","00h, 02m, 30s"

我想用工作时间计算提取包含人“sajjad”字的整行,我想要的输出是这样的:

"Day","Person","Start","End","Elapsed","employee working hours minutes secs"
"2022-10-12","sajjad   ","15:38","22:59","07h, 21m, 22s"
"2022-10-13","sajjad   ","08:37","16:02","07h, 24m, 51s"
"2022-10-17","sajjad   ","14:08","23:57","09h, 48m, 40s","24hrs 34 mints 33"

我用了这个脚本

$log = get-content "C:\Users\NOC-Notebook\Desktop\export.csv"

foreach ($line in $log) { 
    if (($line -like '*sajjad*') )
    {
    $line | out-file -FilePath "C:\Users\NOC-Notebook\Desktop\export1.txt" -Append
    }
}   

但没有得到适当的结果,从这段代码中只得到单列中的人 sajjad 行而不计算,任何帮助将不胜感激。

【问题讨论】:

  • 首先使用 Import-Csv 而不是 Get-Content,这样您就可以拥有具有可用于计算的属性的自定义对象。但是为什么不使用电子表格来完成这项工作呢?
  • @KeithMiller 感谢您的回复,我是编码新手,我不知道如何使用自定义对象属性进行计算。你能分享一个例子吗?我会非常感谢你
  • @Olaf 我看到了您的个人资料,您是 powershell 专家,您能分享您的意见吗?我想计算小时分钟和秒
  • 您共享的示例数据似乎是无效的 CSV 数据。没有分隔符,每个数据行之间有一个空行。请您分享没有任何格式化为代码的格式的原始格式吗?
  • @Olaf 现在请我的 csv 数据,因为我在我的问题中更新了相同的输出

标签: powershell


【解决方案1】:

正如已经指出的那样——如果你有一个正确的 CSV 文件,你应该这样对待它。

基本上应该是你所需要的:

Import-Csv -Path 'C:UsersNOC-NotebookDesktopexport.csv' |
    Where-Object -Property 'Person' -Match -Value 'sajjad'

如果要将其保存到文件中,请添加管道并

    Export-Csv -Path 'C:UsersNOC-NotebookDesktopexport1.txt' -NoTypeInformation

编辑:
如果我根据您的附加评论说对了,您想总结“sajjad”的工作时间,对吗?但是按照您在问题中显示的方式进行操作会导致 CSV 无效。

如果您只对结果感兴趣,您可以使用计算属性来计算每天的工作时间,并在以后通过循环对其进行总结。

输入数据

$InputData = @'
"Day","Person","Start","End","Elapsed"
"2022-10-12","121   ","08:03","18:04","10h, 01m, 06s"
"2022-10-12","sajjad   ","15:38","22:59","07h, 21m, 22s"
"2022-10-13","121   ","08:06","18:25","10h, 19m, 09s"
"2022-10-13","sajjad   ","08:37","16:02","07h, 24m, 51s"
"2022-10-13","128   ","08:27","17:33","09h, 06m, 34s"
"2022-10-13","140   ","09:02","09:03","00h, 01m, 08s"
"2022-10-17","114   ","08:12","14:58","06h, 46m, 37s"
"2022-10-17","sajjad   ","14:08","23:57","09h, 48m, 40s"
"2022-10-17","128   ","08:30","12:23","03h, 53m, 34s"
"2022-10-17","133   ","08:17","08:19","00h, 02m, 30s"
'@ | 
ConvertFrom-Csv

将工作时间添加为时间跨度值

$Result = 
$InputData |
Where-Object -Property 'Person' -Match -Value 'sajjad' |
Select-Object -Property *,
@{
    Name       = 'WorkingHours'
    Expression = {
        New-TimeSpan -Start $_.Start -End $_.End
    }
}

计算总和

$Result |
    ForEach-Object {
        $WorkingHoursSum += $_.WorkingHours
    }
$WorkingHoursSum

如果需要,您可以使用结果进行计算。为了提高可读性,您可以根据需要格式化输出。例如像这样:

'sajjad worked {0:n0} hours and {1} minutes in total.' -f $WorkingHoursSum.TotalHours, $WorkingHoursSum.Minutes

【讨论】:

  • 由此,我可以将员工 sajjad 行从 csv 导出到另一个同意的 csv,但是如何计算 csv 表中员工 sajjad 的所有工作时间,如我的问题所示。
  • 更新了我的答案...这是您要找的吗?
【解决方案2】:

我终于做对了。时间跨度不起作用,因为开始时间和结束时间没有秒数。

date       person start end   elapsed
----       ------ ----- ---   -------
10/17/2022 114    08:12 14:58 06h, 46m, 37s, 06 hrs 46 mins 37 secs
10/13/2022 121    08:06 18:25 10h, 19m, 09s, 10 hrs 19 mins 09 secs
10/13/2022 128    08:27 17:33 09h, 06m, 34s
10/17/2022 128    08:30 12:23 03h, 53m, 34s, 13 hrs 00 mins 08 secs
10/17/2022 133    08:17 08:19 00h, 02m, 30s, 00 hrs 02 mins 30 secs
10/13/2022 140    09:02 09:03 00h, 01m, 08s, 00 hrs 01 mins 08 secs
10/12/2022 sajjad 15:38 22:59 07h, 21m, 22s
10/13/2022 sajjad 08:37 16:02 07h, 24m, 51s
10/17/2022 sajjad 14:08 23:57 09h, 48m, 40s, 24 hrs 34 mins 53 secs





#$match = Select-String -Path "c:	emp	est.txt" -Pattern '^(?<date>dd/dd/dddd)s+(?<person>[^s]+)s+(?<start>[^s]+)s+(?<end>[^s]+)s+(?<elapsed>.*$)'
$match = Select-String -Path "c:	emp	est.txt" -Pattern '^"(?<date>dddd-dd-dd)","(?<person>[^s]+)s+","(?<start>[^"]+)","(?<end>[^"]+)","(?<elapsed>.*$)'
#Write-Host $match

$table = [System.Collections.ArrayList]::new()
$i = 0
foreach( $row in $match.Matches )
{
   if(++$i -gt 1)
   {
      $newRow = New-Object -TypeName psobject
      $j = 0
      foreach($group in $row.Groups)
      {
          if(++$j -gt 1)
          {
             $newRow | Add-Member -NotePropertyName $group.Name -NotePropertyValue $group.Value
          }
      }
      $table.Add($newRow)  | Out-Null
   }
}

$table = $table | Sort-Object {$_.person}

$table | format-table

$groups = $table | Group-Object {$_.person}
#$groups | Format-Table
$pattern = "^(?<hours>d{2})h,s(?<minutes>d{2})m, (?<seconds>d{2})s" 
foreach($group in $groups)
{
   $timeSpan = New-TimeSpan
   $hours = 0
   foreach($col in $group.Group)
   {
       $match = $col.elapsed | Select-String -Pattern $pattern
       $hours = [int]$match.Matches.groups[1].value  #.hours.Value
       $minutes = [int]$match.Matches.groups[2].value
       $seconds = [int]$match.Matches.groups[3].value
       $newTimeSpan = New-TimeSpan -Hours $hours -Minutes $minutes -Seconds $seconds
       $timeSpan += $newTimespan
   }
    $totalHours =("{0:00} hrs {1:00} mins {2:00} secs" -f (24 * $timeSpan.Days + $timeSpan.Hours),$timeSpan.Minutes, $timeSpan.Seconds)
    $last = $group.Group | Select-Object -Last 1
    $last.elapsed = $last.elapsed + ", " + $totalHours
}
$table | format-table

#https://stackoverflow.com/questions/74129016/i-want-a-powershell-script-from-which-i-extract-few-lines-from-csv-file-to-anoth

【讨论】:

  • 为什么 TimeSpan 不起作用?输入的开始时间和结束时间也没有秒数?!
  • @jdweng 感谢您的回复,您能否让我理解您所说的从您的代码中取得了什么样的结果,请解释一下,test.txt 文件中的内容是什么。
  • 该文本正是您在 csv 文件中发布的内容。
  • @Olaf:开始时间和结束时间没有秒数。只有经过的列有秒数。经过时间是结束列 - 开始但更精确。
  • @jdweng 我将您的代码与给定的 csv 数据一起使用,但没有收到任何输出!
猜你喜欢
  • 2022-01-14
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多