Извлечение даты и времени из длинной строки - PullRequest
0 голосов
/ 21 декабря 2018

Мне дали ужасно отформатированный отчет, который должен быть CSV, но на самом деле это не так, поэтому мне нужно импортировать и преобразовать его.Я преобразовал его, и у меня есть пригодные для использования данные, однако в последнем столбце у меня слишком много бесполезных данных, и я хотел бы извлечь дату и время из начала строки и из конца.

Я пробовал несколькоразными способами, но я не могу получить то, что хочу.

Это код, который я запускаю:

$csvPath = 'C:\Powershell\Test5.csv'
$csvData = Get-Content -Path $csvPath |
           Select-Object -Skip 1 |
           Out-String |
           ConvertFrom-Csv
$AuditTrail = $csvData | Select-Object "Approval History"

$AuditTrail | foreach {
    $entry = $_ -split 'Approved'
    $entry[-2]
}

Вывод:

12/11/2018 10:20 AM  Submitted for approval by Joseph Star  12/11/2018 12:00 PM  
12/11/2018 05:16 PM  Submitted for approval by Joseph Star  12/12/2018 07:46 AM  
12/13/2018 09:41 AM  Submitted for approval by Joseph Star  12/13/2018 10:28 AM  
12/13/2018 05:16 PM  Submitted for approval by Joseph Star  12/14/2018 07:49 AM  
12/14/2018 05:22 PM  Submitted for approval by Joseph Star  12/18/2018 10:14 AM  
12/11/2018 10:06 AM  Submitted for approval by Jimmy Newton  12/14/2018 11:36 AM  
12/11/2018 06:33 PM  Submitted for approval by Jimmy Newton  12/14/2018 11:37 AM  
12/17/2018 10:28 AM  Submitted for approval by Jimmy Newton  12/18/2018 04:33 PM  
12/13/2018 03:31 PM  Submitted for approval by Jimmy Newton  12/14/2018 11:37 AM  
12/17/2018 10:33 AM  Submitted for approval by Jimmy Newton  12/18/2018 04:33 PM  
12/10/2018 05:59 PM  Submitted for approval by Stan Henry  12/11/2018 09:10 AM  
12/12/2018 10:59 AM  Submitted for approval by Stan Henry  12/14/2018 02:35 PM  
12/12/2018 05:01 PM  Submitted for approval by Stan Henry  12/14/2018 02:15 PM  
12/14/2018 10:12 AM  Submitted for approval by Stan Henry  12/14/2018 02:27 PM  
12/16/2018 11:24 PM  Submitted for approval by Stan Henry  12/19/2018 01:12 PM  
12/16/2018 11:25 PM  Submitted for approval by Stan Henry  12/18/2018 11:12 AM  

Из этого вывода я хотел бы взять первые 19 символов (полная дата и время) и сохранить их в переменной.Затем я хотел бы взять последние 19 символов (полную дату и время) и сохранить их в другой переменной.

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Самое краткое решение - разделить каждую строку на два пробела , учитывая, что они разделяют как дату в начале, так и в конце, как указывает Ansgar Wiechers :

$line = '12/11/2018 10:20 AM  Submitted for approval by Joseph Star  12/11/2018 12:00 PM'
$date1, $date2 = [datetime[]] ($line -split '  ')[0,-1]

Аналогичное краткое решение на основе regex , в котором даты извлекаются на основе сопоставления с шаблоном , см. ответ seedie , который можетбыть упрощенным следующим образом:

$line = '12/11/2018 10:20 AM  Submitted for approval by Joseph Star  12/11/2018 12:00 PM'
[regex] $regex = '\b\d{2}/\d{2}/\d{4} \d{2}:\d{2} (?:AM|PM)\b'
$date1, $date2 = [datetime[]] $regex.Matches($line).Value
0 голосов
/ 21 декабря 2018

Если вы не можете полагаться на два пробела, разделяющих даты, вы можете использовать регулярное выражение

$line = '12/11/2018 10:20 AM  Submitted for approval by Joseph Star  12/11/2018 12:00 PM'
[regex]$regex = '((0?[1-9]|1[012])[\/](0?[1-9]|[12][0-9]|3[01])[\/\-]\d{4} [01][0-9][\:][0-5][0-9] [AP]M)'
$date1, $date2 = [datetime[]] $regex.Matches($line).Value

на основе ответа mklement0

0 голосов
/ 21 декабря 2018

Есть несколько способов, которыми это может быть достигнуто, самый простой, который я могу придумать, но также немного «быстрый и грязный» подход:

$string = "12/11/2018 10:20 AM  Submitted for approval by Joseph Star  12/11/2018 12:00 PM "
[datetime]$date1 = ($string -split " ")[0..2] -join " "
[datetime]$date2 = ($string -split " ")[-4..-1] -join " "

По сути, просто -split в массив, используя пробелы " ", возьмите первые 3 элемента ([0..2]) из этого массива и затем -join верните их обратно в строку перед приведением к [datetime].Аналогично для второй даты, но возьмите последние 3 элемента ([-4..-1]) из массива.

При желании вы можете сжать его в 1 строку:

[datetime]$date1,[datetime]$date2 = (($string -split " ")[0..2] -join " "),(($string -split " ")[-4..-1] -join " ")

Который выводит:

[Fri 21 Dec 00:28:26] PS C:\WINDOWS\system32>$date1

11 December 2018 10:20:00

[Fri 21 Dec 00:30:01] PS C:\WINDOWS\system32>$date2

11 December 2018 12:00:00

Если строки когда-либо изменяются или даты не всегда являются первыми 3 или 3 последними наборами последовательных символов, то это не будет работать.

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