Выбрать-String -Context и найти адрес электронной почты в данных

У меня есть текстовый файл, в котором варианты этих данных (число после 'SVC' и дата до, вместе с текстом) будут появляться несколько раз. Я могу захватить строку данных, но как только я это сделаю, мне нужно найти адрес электронной почты внутри этих данных. Письмо может появиться в контексте в любой строке с 4 по 9. Похоже, я не могу понять, как изолировать данные и установить их как переменную, чтобы их можно было перехватить.

Select-String $WLDir -pattern '(\d{2}:\d{2}) - (\d{2}:\d{2})(PMT[S|T]\d{8})' -Context 0,9 | ForEach-Object {
        $StartTime=[datetime]::ParseExact($_.Matches.Groups[1].Value,"HH:mm",$null)
        $EndTime=[datetime]::ParseExact($_.Matches.Groups[2].Value,"HH:mm",$null)
        $ElapsedTime = (NEW-TIMESPAN –Start $StartTime –End $EndTime).TotalHours
        $Email = Select-String $_. -pattern '(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)'
    [PSCustomObject]@{
        SO = $_.Matches.Groups[3].Value
        Topic = $_.Context.PostContext[0]
        Status = $_.Context.PostContext[1]
        ElapsedHrs = $ElapsedTime
        Email = $Email
    }
} | Export-Csv $ExportCsv -NoTypeInformation

Мой пример файла выглядит так:

  09:45 - 10:15SVC1234567 | Sev8 |437257 | COMPANY | Due: 12/28/2016
  WORK TITLE
  - - Preferred Customer (Y/N): Y Phone: 000-000-0000 ANY Hardware (Y/N): N 
  DATA on file (Y/N/NA): Y Contact: Person Name Full Address: 1234 PANTS 
  XING, RM/STE 100,NEWARK, NJ, 00000 - Hours: 8-5 Issue: Install admin 
  and others Fax Number: NA (required for all cases sent to LOCATION or 
  LOCATION_EXCPT Provider Groups) E-Mail address: email@location.com the 
  customer speak English? yes Escalation Approved By (Name/ID): Guy 
  aljdfs ITEM Product: PRODUCTNAME Group:THIS ONE Include 
  detailed notes below, including reason for severity: SCHEDULED WORK 
  ------------------------------ NOTES: -Cx requesting a tech on site -Cx 
  wants to install WS and wants to be assisted in other concerns

Я пытался захватить электронную почту в контексте с $Email = Select-String $_. -pattern '(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)', $Email = Select-String $_.WLDir -pattern '(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)' а также $Email = Select-String $_.Context -pattern '(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)' но не могу понять, как перезвонить контекст для поиска в нем адреса электронной почты. Также есть хороший шанс, что я все делаю неправильно. Кто-нибудь знает, как я могу захватить это и установить его в качестве переменной?

2 ответа

Решение

Поскольку я так и не нашел точного способа сбора этой информации, я решил зафиксировать все строки 0-9 в пост-контексте в Status. На листе Excel я использую расчет с этой страницы =IF(O6="","",TRIM(RIGHT(SUBSTITUTE(LEFT(O6,FIND(" ",O6&" ",FIND("@",O6))-1)," ",REPT(" ",LEN(O6))),LEN(O6)))) вытащить данные из столбца "O" в столбец "Q", к которому относится электронная почта. Я ценю помощь каждого.

Попробуй это:

$content = gc -path $path -Raw | Out-String
$regex1 = [regex]"\w+@\w+.\w+"
$regex2=[regex]"(?ms)(\d{2}:\d{2}) - (\d{2}:\d{2})(\D+)(\d+)(.*)"
$content | Select-String -pattern $regex2 | %{
$startTime = [datetime]::ParseExact(($regex2.Matches($content) | %{$_.Groups[1].Value}),"HH:mm",$null) 
$endTime = [datetime]::ParseExact(($regex2.Matches($content) | %{$_.Groups[2].Value}),"HH:mm",$null) 
$elapsedTime = (NEW-TIMESPAN –Start $startTime –End $endTime).TotalHours
$code = "PMT" + ($_.Matches.Groups[4].value) 
$remainingString = $_.Matches.Groups[5].Value
$topic = $remainingString.split("`n")[1] 
$status = $remainingString.split("`n")[2] 
$email = $regex1.Matches($remainingString).Value    

[PSCustomObject]@{
        SO = $code
        Topic = $topic
        Status = $status
        ElapsedHrs = $elapsedTime
        Email = $email
    }
} | Export-Csv "res.csv" -NoTypeInformation
Другие вопросы по тегам