Используя PowerShell, как мне создать / разбить файл на недельные фрагменты? - PullRequest
0 голосов
/ 09 марта 2012

Это ссылка на пост здесь: Как удалить строки на основе даты из файлов с помощью PowerShell

Используя приведенный ниже код (предоставленный 'mjolinor'), я могу взять монолитный CSV-файл (с разделителем "|") и создать обрезанный CSV-файл, содержащий только строки, содержащие даты меньше $date:

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

Приведенный выше код прекрасно работает! Теперь мне нужно создать дополнительные CSV-файлы из монолитного CSV-файла со строками, содержащими даты >= $date, и каждый файл должен быть разделен на 1 неделю, начиная с $date.

Например, мне нужны следующие «обрезанные» CSV-файлы (все они созданы из исходного CSV):

  • Все даты менее 30.09.2011 (уже с кодом выше)
  • Файл с диапазоном дат 09/30 - 10/6
  • Файл с диапазоном дат 10/7 - 10/14
  • И т. Д., И т. Д., Пока я не достигну самой последней даты

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

Вы можете использовать GetWeekOfYear метод Calendar как этот

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

для определения номера недели данной даты.

2 голосов
/ 09 марта 2012

Это НЕ проверено с вашим вводом (он был адаптирован из некоторого сценария, который я использую для среза времени и подсчета событий журнала 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
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...