使用PowerShell,如何在1周的块中创建/拆分文件?

时间:2012-03-08 20:59:07

标签: powershell

这是参考此处的帖子:How to delete date-based lines from files using PowerShell

使用下面的代码(由'mjolinor'提供)我可以采用单片(管道“|”分隔)CSV文件,并创建一个仅包含日期小于$date的行的修剪CSV文件:

$date = '09/29/2011'
foreach ($file in gci *.csv) {
    (gc $file) |
     ? {[datetime]$_.split('|')[1] -lt $date
     } | set-content $file
 }

以上代码效果很好!我现在需要做的是从单片CSV文件创建其他CSV文件,其中的行包含日期>= $date,每个文件需要在$date前后的一周内完成。

例如,我需要以下“修剪过的”CSV文件(全部由原始CSV创建):

  • 所有日期均低于09/30/2011(已完成上述代码)
  • 日期范围为09/30 - 10/6
  • 的文件
  • 日期范围为10/7 - 10/14
  • 的文件
  • Etc等,直到我到达最近的日期

2 个答案:

答案 0 :(得分:3)

您可以使用GetWeekOfYear这样的Calendar方法

$date = (Get-Date)
$di = [Globalization.DateTimeFormatInfo]::CurrentInfo
$week = $di.Calendar.GetWeekOfYear($date, $di.CalendarWeekRule, $di.FirstDayOfWeek)

确定给定日期的周数。

答案 1 :(得分:2)

这不是使用您的输入进行测试的(它是根据我用于时间切片和计算Windows日志事件的一些脚本改编而来的),但应该接近工作。它可以在$ span中指定的任意时间范围内创建文件:

 $StartString = '09/29/2011'
 $inputfile = 'c:\somedir\somefile.csv'

 $Span = new-timespan -days 7
 $lines = @{}

 $TimeBase = [DateTime]::MinValue
 $StartTicks = ([datetime]$startString).Ticks
 $SpanTicks = $Span.Ticks

 get-content $inputfile |
  foreach {
     $dt = [datetime]$_.split('|')[1]
     $Time_Slice = [int][math]::truncate(($dt.Ticks - $StartTicks) / $SpanTicks)
     $lines[$Time_Slice] += @($_)
     }

  $lines.GetEnumerator() |
      foreach {
       $filename = ([datetime]$StartString + [TimeSpan]::FromTicks($SpanTicks * $_.Name)).tostring("yyyyMMdd") + '.csv'
       $_.value | export -csv $filename
   }