Преобразовать текстовую дату в дд / мм / гггг - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть CSV-файл с данными даты, хранящимися в строковом формате, например, «Sat 9th Feb 2019».Используя Powershell, как мне преобразовать это в формат даты дд / мм / гггг?

Ответы [ 4 ]

0 голосов
/ 16 февраля 2019

Если ваши строки ввода даты имеют порядковые суффиксы ((1) st, (2) nd, (3) rd, n- th), самый простой способ преобразовать их в [datetime] экземпляры просто удалить эти суффиксы перед приведением к [datetime];тогда результат можно легко переформатировать при необходимости:

PS> ([datetime] ('Sat 9th Feb 2019' -replace '(?<=\d)(st|nd|rd|th)')).ToString('dd"/"MM"/"yyyy')
09/02/2019   

-replace '(?<=\d)(st|nd|rd|th)' использует регулярное выражение для замены суффиксов st или (|) nd или rd или th после цифры (\d, с помощью обратного утверждения, (?<=...)) с (подразумеваемой) пустой строкой , таким образом эффективно удаляя всепорядковые суффиксы .

Примечание:

  • Использование [datetime] cast интерпретирует его операнд как строку даты, отформатированную в соответствии с правилами инвариантной культуры (основанной на американском английском языке) - независимо от текущей культуры сеанса (как отражено в Get-Culture).

  • Это MM, а не mm, который представляет двузначный индекс месяца на основе 1 (например, 02 для февраля).

  • Использование без кавычек / в строке формата, переданной в .ToString(), не будет литерал /: вместо этого он представляет соответствующий дате компонент культурыseparator, который в основанных на английском языке культурах бывает /, но может быть другим характером в других культурах; цитирование / - заключая его в " (как указано выше) или ' - обеспечивает его буквальное использование - см. Пользовательские строки формата даты и времени .

  • Предполагается, что введенные даты внутренне согласованы , то есть день недели (например, Sat) должен совпадать с фактическим календарным днем, подразумеваемым остальной частью строки.- если нет, вы получите ошибку.


Более медленная, но более идиоматическая альтернатива PowerShell - адаптировать AdminOfThings 'ответ :

PS> Get-Date ('Sat 9th Feb 2019' -replace '(?<=\d)(st|nd|rd|th)') -Format 'dd"/"MM"/"yyyy'
09/02/2019

Примечание:

  • Из-за давней ошибки , которая не будет исправлена, аргументы передаются в параметры cmdlet (например, Get-Date (подразумевается) -Date параметр) фактически преобразуются из строк на основе текущей культуры, а не инварианта культуры.

  • Однако в конкретном случае типа [datetime], английский названия месяцев (например, Feb или February) имеют всегда распознавание в дополнение к культурно-специфическим именам.

0 голосов
/ 16 февраля 2019

Я не думаю, что ранее отвеченный вопрос делает все, что нужно Энди здесь.Когда вы запускаете команду (get-date).getdatetimeformats(), ничто не соответствует его начальному формату ввода.Следующее должно вывести то, что вы хотите:

"Sat 9th Feb 2019" -replace "(\d+)(th|nd|st|rd)",'$1' | get-date -format "dd/MM/yyyy"

Здесь замена использует регулярное выражение замены, и она не учитывает регистр (\d+) ищет одну или несколько цифр и называет их группой 1. (th|nd|st|rd)ищет строки th, nd, st или rd и называет их группой 2. Поскольку эти группы расположены рядом друг с другом, регулярное выражение ожидает одну или несколько цифр, за которыми непосредственно следует одна из четырех строк.$1 - это способ показать только содержимое группы захвата 1. Если взять в качестве примера 24th, 24 квалифицируется как одна или несколько цифр и называется группой 1. th квалифицируется как одна из четырехи называется группой 2. Оператор замены заменяет группу 1 и группу 2 просто группой 1. Следовательно, 24-е становится 24.

Вот практический пример вашего сценария:

$CSVData = import-csv X:\Temp\MyCSVFile.csv
PS H:\> $CSVData

Date              Data
----              ----
Sat 9th Feb 2019  Data about something
Thu 31st Jan 2019 January data
Sat 2nd Feb 2019  Groundhog Day
Sun 3rd Mar 2019  Beginning of March

PS H:\> $CSVData.date -replace "(\d+)(th|nd|st|rd)",'$1' | get-date -format "dd/MM/yyyy"
09/02/2019
31/01/2019
02/02/2019
03/03/2019

Если вы хотите переформатировать дату вместе с выводом оставшихся данных файла CSV, вы можете выполнить:

PS H:\> $CSVData | select-object @{n='Date';e={$_.date -replace "(\d+)(th|nd|st|rd)",'$1' | get-date -format "dd/MM/yyyy"}},Data

Date       Data
----       ----
09/02/2019 Data about something
31/01/2019 January data
02/02/2019 Groundhog Day
03/03/2019 Beginning of March

Если вы намереваетесь обновить файл с недавно отформатированными данными, тогда выможет запустить следующее, чтобы поместить обновления в файл с именем NewCSVFile.csv:

$CSVData | select-object @{n='Date';e={$_.date -replace "(\d+)(th|nd|st|rd)",'$1' | get-date -format "dd/MM/yyyy"}},Data | export-csv C:\Temp\NewCSVFile.csv -notypeinformation
0 голосов
/ 16 февраля 2019

Я не смог найти способ избежать th в 9th [или любого другого суффиксированного числа].так что ...

  • разрывает строку в пробелах
  • удаляет все нецифровые символы во втором элементе массива
  • объединяет части в строку с пробеломразделители
  • использует обычный Get-Date -Date для преобразования в [datetime] объект

вот код ...

$DateString = 'Sat 9th Feb 2019'

$SplitDateString = $DateString.Split(' ')
$SplitDateString[1] = $SplitDateString[1] -replace '[^0-9]', ''
$CleanedDateString = $SplitDateString -join ' '

Get-Date -Date $CleanedDateString

output ...

2019 February 09, Saturday 12:00:00 AM

моя локаль была переопределена для использования гггг ММММ дд в качестве формата длинной даты [и гггг ММ дд в качестве формата короткой даты].


вот версия, которая напрямую удаляет порядковые суффиксы [спасибо mklement0 за фразу, которая позволила мне окончательно идентифицировать эти] ...

$OrdinalSuffixList = @(
    'st'
    'nd'
    'rd'
    'th'
    )
$RegexOrdinalSuffixList = $OrdinalSuffixList -join '|'

$DateString = 'Sat 9th Feb 2019'

Get-Date -Date ($DateString -replace "(\d+)$RegexOrdinalSuffixList", '$1')

output ...

2019 February 09, Saturday 12:00:00 AM

приведенное выше регулярное выражение находит «порядковые суффиксы» и заменяет их ничем.в этот момент обычный Get-Date может проанализировать этот макет строки даты.

0 голосов
/ 16 февраля 2019

$ invoice = '01 -Jul-16 '[datetime] :: parseexact ($ invoice,' dd-MMM-yy ', $ null)

На вопрос уже ответили Строка преобразования Powershellна сегодняшний день

Заполнители для различных форматов можно получить из https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-date?view=powershell-6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...