Импорт данных из CSV в Powershell Предоставление даты Великобритании в CSV менее чем за 7 дней

поэтому у меня есть файл CSV с 5 заголовками: имя, дата сбора, местоположение, оборудование, заметки, менеджер.

Теперь все даты моей коллекции указаны в британском формате, поэтому ДД/ММ/ГГГГ. Я хочу только импортировать данные из CSV с датами сбора, которые в будущем на 7 дней или меньше. Итак, сегодня 17/08, поэтому я хотел бы получить только данные из CSV, датированные периодом с 17/08 по 24/08.

Хотя Powershell обрабатывает объекты даты и времени в британском формате, если вы скажете об этом, я, похоже, не могу затем манипулировать датой, чтобы добавить 7 дней.

Вот мой текущий код:

$today = Get-Date
$thisWeek = $today.AddDays(7)
$thisWeekString = $thisWeek.ToString()
$dateParts = $thisweekString -split " "
$weekFinal = $dateParts[0]

$import = Import-Csv @("\\location\EmailCSV.csv") | Where-Object {$_.collectionDate -lt $weekFinal}

Powershell правильно добавляет 7 дней к дате и времени, чтобы сделать его 24/08, а затем при преобразовании его в строку и удалении из него времени он правильно устанавливает переменную как 24/08/2018. Но когда я затем иду сравнивать их в командлете Import, он просто возвращает все данные в CSV, а не даты меньше 24/08.

Я также знаю, что Powershell может сравнить их, потому что, если я создам отдельную переменную $otherDate с 24/08/2018 в ней, а затем создам оператор if, который проверяет, больше или меньше $weekFinal, чем $otherDate, он правильно выполняет оператор когда правда.

Я пробовал использовать как Where, так и Where-Object в командлете Import-Csv, но оба вернули одинаковые результаты.

Как заставить Powershell правильно сравнивать $_.collectionDate и $weekFinal для фильтрации импортированных данных из CSV?


person HMNIW    schedule 17.08.2018    source источник
comment
$weekFinal и ваши $_ будут строками. Сравнение строк, являющихся датами, требует, чтобы оба значения были известными типами, сопоставимыми, поэтому преобразование в [datetime] может быть самым простым выходом. Ниже я добавлю ответ, который, кажется, подходит, когда я смоделировал CSV, как я полагаю, ваш.   -  person gravity    schedule 17.08.2018


Ответы (2)


Проще всего выполнять все вычисления и сравнения, используя [datetime] экземпляры — избегайте строковых операций (за исключением преобразования строкового представления даты в [datetime] экземпляра). экземпляр).

Во-первых, выразите сегодняшнюю дату и 1 неделю с этого момента как экземпляр [datetime] без компонента времени суток:

$today = (Get-Date).Date  # Today's date, without a time component (midnight)
$oneWeekFromToday = $today.AddDays(7)

Затем используйте [datetime]::Parse(), чтобы преобразовать интересующее значение столбца CSV с неизменно строковым типом в экземпляр [datetime], чтобы вы могли выполнить правильное сравнение дат.

$import = Import-Csv \\location\EmailCSV.csv | Where-Object { 
  $thisDate = [datetime]::Parse($_.collectionDate)
  # Process this row if its date falls between today and 1 week from now, inclusively.
  $thisDate -ge $today -and $thisDate -le $oneWeekFromToday
}

Важно: используйте [datetime]::Parse('...'), а не [datetime] '...' приведение, потому что только [datetime]::Parse() соответствует текущей культуре; по замыслу приведения PowerShell и интерполяции строк всегда используют < em>инвариантная культура, независимо от текущей культуры - для получения дополнительной информации см. этот ответ мой.

person mklement0    schedule 17.08.2018

Попробуйте привести строки к [datetime] в вашем сравнении. При использовании выборочного набора данных я смог получить ожидаемые результаты.

$import = Import-Csv @("\\location\EmailCSV.csv") | Where-Object {[datetime]$_.collectionDate -lt [datetime]$weekFinal}
person gravity    schedule 17.08.2018