Как отформатировать экспорт текста шаблона в Powershell - PullRequest
0 голосов
/ 29 мая 2019

Я создаю сценарий powershell для форматирования файлов .txt и в конечном итоге для преобразования в файл csv (если это не может быть сделано вместе). Я перебрал довольно много других вопросов, но не смог понять это. Каждый раз, когда я запускаю приведенный ниже скрипт, он выбирает все нужные мне данные, но помещает их в одну строку.

$importPath = 'C:\Example.txt'
$pattern = "<return>(.*?)</return>"

$string = Get-Content $importPath
$result = [regex]::match($string, $pattern).Groups[1].Value
$result | Out-File -FilePath 'C:\ResponseOnly.txt'

Буду признателен за помощь в определении способа получения всей информации между <return> и </return>, но при этом все данные будут разбиты на исходные строки.

Пример исходного файла:

Status: OK
Time Taken: 193
Size: 46511
Timestamp: Thu May 30 03:39:37 MDT 2019
TestStep: getReportResultCsv

----------------- Messages ------------------------------

----------------- Properties ------------------------------
Endpoint: XXXXXXXXXXXXXXXXXXXXXXX
Username: XXXXXXXXXXXXXXXXXXXXXXX
domain: XXXXXXXXXXXXXXXXXXXXXXX HTTP/1.1
Encoding: UTF-8
Password: XXXXXXXXXXXXXXXXXXXXXXX

---------------- Request ---------------------------
Request Headers: SOAPAction : ""
Authorization : Basic XXXXXXXXXXXXXXXXXXXXXXX
Connection : Keep-Alive
User-Agent : Apache-HttpClient/4.1.1 (java 1.5)
Host : XXXXXXXXXXXXXXXXXXXXXXX
Accept-Encoding : gzip,deflate
Content-Length : 378
Content-Type : text/xml;charset=UTF-8


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="XXXXXXXXXXXXXXXXXXXXXXX">
  <soapenv:Header/>
   <soapenv:Body>
      <ser:getReportResultCsv>
         <!--Optional:-->
         <identifier>A0294584B2F933513rt0.c.ie.oF0BBB@5p70B7FsBlEf4v490cAm</identifier>
      </ser:getReportResultCsv>
   </soapenv:Body>
</soapenv:Envelope>

---------------- Response --------------------------
Response Headers: Transfer-Encoding : chunked
Server : nginx
Access-Control-Allow-Origin : *
Access-Control-Allow-Methods : POST,GET,OPTIONS
Connection : keep-alive
Content-Encoding : gzip
Set-Cookie : clientId=XXXXXXXXXXXXXXXXXXXXXXX
#status# : HTTP/1.1 200 OK
Date : Thu, 30 May 2019 09:39:37 GMT
Content-Type : text/xml;charset=UTF-8


<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
   <env:Header/>
   <env:Body>
      <ns2:getReportResultCsvResponse xmlns:ns2="XXXXXXXXXXXXXXXXXXXXXXX">
         <return>DATE,AGENT GROUP,AGENT NAME,CALLS,HANDLE TIME,Average HANDLE TIME,HOLD TIME,Average HOLD TIME,Average AFTER CALL WORK TIME
2019/04/04,Billy Bob,Joe Joseph,6,04:15:53,00:42:39,00:00:00,00:00:00,00:01:55
2019/04/05,Billy Bob,Joe Joseph,14,04:39:26,00:19:58,00:47:53,00:03:25,00:02:20
2019/04/06,Billy Bob,Joe Joseph,11,06:33:13,00:35:45,00:17:21,00:01:35,00:04:30
2019/04/07,Billy Bob,Joe Joseph,13,05:47:06,00:26:42,00:02:03,00:00:09,00:02:27
2019/04/08,Billy Bob,Joe Joseph,11,03:20:21,00:18:13,00:00:03,00:00:00,00:02:44</return>
      </ns2:getReportResultCsvResponse>
   </env:Body>
</env:Envelope>

Пример того, каким должен быть файл:

DATE,AGENT GROUP,AGENT NAME,CALLS,HANDLE TIME,Average HANDLE TIME,HOLD TIME,Average HOLD TIME,Average AFTER CALL WORK TIME
2019/04/04,Billy Bob,Joe Joseph,6,04:15:53,00:42:39,00:00:00,00:00:00,00:01:55
2019/04/05,Billy Bob,Joe Joseph,14,04:39:26,00:19:58,00:47:53,00:03:25,00:02:20
2019/04/06,Billy Bob,Joe Joseph,11,06:33:13,00:35:45,00:17:21,00:01:35,00:04:30
2019/04/07,Billy Bob,Joe Joseph,13,05:47:06,00:26:42,00:02:03,00:00:09,00:02:27
2019/04/08,Billy Bob,Joe Joseph,11,03:20:21,00:18:13,00:00:03,00:00:00,00:02:44

Ответы [ 2 ]

1 голос
/ 30 мая 2019

_ [
редактировать - я пропустил пост TheMadTechnician. [ вздох ... ] Я оставлю это здесь на всякий случай, если незначительные различия помогут ОП немного.

edit 2 - TheMadTechnician указал, что использование параметра -Raw для Get-Content в этом случае не требуется. удалил это и добавил необходимый -split, чтобы создать правильный поддельный набор данных Get-Content.
] _

вот один из способов получить эти данные в CSV. поскольку это действительный XML, вы можете использовать ускоритель типа [xml] для преобразования его из текста в объект XML. После этого вы можете перейти к XML в том месте, где находятся данные CSV. как только вы окажетесь там, вы можете передать это в командлет ConvertFrom-CSV, чтобы создать массив объектов.

затем, наконец [ ухмылка ], вы можете экспортировать этот красивый, аккуратный массив в файл CSV с помощью Export-CSV.

вот код ...

# fake reading in a text file
#    in real life, use Get-Content
$InStuff = @'
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
   <env:Header/>
   <env:Body>
      <ns2:getReportResultCsvResponse xmlns:ns2="XXXXXXXXXXXXXXXXXXXXXXXXXXXXX">
         <return>DATE,AGENT GROUP,AGENT NAME,CALLS,HANDLE TIME,Average HANDLE TIME,HOLD TIME,Average HOLD TIME,Average AFTER CALL WORK TIME
2019/04/04,Billy Bob,Joe Joseph,6,04:15:53,00:42:39,00:00:00,00:00:00,00:01:55
2019/04/05,Billy Bob,Joe Joseph,14,04:39:26,00:19:58,00:47:53,00:03:25,00:02:20
2019/04/06,Billy Bob,Joe Joseph,11,06:33:13,00:35:45,00:17:21,00:01:35,00:04:30
2019/04/07,Billy Bob,Joe Joseph,13,05:47:06,00:26:42,00:02:03,00:00:09,00:02:27
2019/04/08,Billy Bob,Joe Joseph,11,03:20:21,00:18:13,00:00:03,00:00:00,00:02:44</return>
      </ns2:getReportResultCsvResponse>
   </env:Body>
</env:Envelope>
'@ -split [System.Environment]::NewLine

$IS_XML = [xml]$InStuff
$ReportResult = $IS_XML.Envelope.Body.getReportResultCsvResponse.return |
    ConvertFrom-Csv

# on screen
$ReportResult

# to CSV
$ReportResult |
    Export-Csv -LiteralPath "$env:TEMP\TaylorGreen_-_ReportResult.csv" -NoTypeInformation

усеченный вывод на экран ...

DATE                         : 2019/04/04
AGENT GROUP                  : Billy Bob
AGENT NAME                   : Joe Joseph
CALLS                        : 6
HANDLE TIME                  : 04:15:53
Average HANDLE TIME          : 00:42:39
HOLD TIME                    : 00:00:00
Average HOLD TIME            : 00:00:00
Average AFTER CALL WORK TIME : 00:01:55

[*...snip...*] 

DATE                         : 2019/04/08
AGENT GROUP                  : Billy Bob
AGENT NAME                   : Joe Joseph
CALLS                        : 11
HANDLE TIME                  : 03:20:21
Average HANDLE TIME          : 00:18:13
HOLD TIME                    : 00:00:03
Average HOLD TIME            : 00:00:00
Average AFTER CALL WORK TIME : 00:02:44

Содержимое файла csv ...

"DATE","AGENT GROUP","AGENT NAME","CALLS","HANDLE TIME","Average HANDLE TIME","HOLD TIME","Average HOLD TIME","Average AFTER CALL WORK TIME"
"2019/04/04","Billy Bob","Joe Joseph","6","04:15:53","00:42:39","00:00:00","00:00:00","00:01:55"
"2019/04/05","Billy Bob","Joe Joseph","14","04:39:26","00:19:58","00:47:53","00:03:25","00:02:20"
"2019/04/06","Billy Bob","Joe Joseph","11","06:33:13","00:35:45","00:17:21","00:01:35","00:04:30"
"2019/04/07","Billy Bob","Joe Joseph","13","05:47:06","00:26:42","00:02:03","00:00:09","00:02:27"
"2019/04/08","Billy Bob","Joe Joseph","11","03:20:21","00:18:13","00:00:03","00:00:00","00:02:44"
0 голосов
/ 30 мая 2019

Это проще, чем вы ожидаете, поскольку у вас есть для ввода XML. Попробуйте это:

$importPath = 'C:\Example.txt'
[xml]$DataIn=Get-Content $importPath
$DataIn.Envelope.Body.getReportResultCsvResponse.return| Out-File -FilePath 'C:\ResponseOnly.txt'

Это просто даст вам то, что вы ищете.

Если вы действительно хотите использовать RegEx, я бы прочитал весь файл как многострочную строку и сопоставил бы ее, чтобы получить ваш вывод. Вам просто нужно сообщить RegEx, что вы собираетесь использовать многострочную строку, когда вы это делаете.

$pattern = "(?ms)<return>(.*?)</return>"
$string = Get-Content $importPath -raw
$result = [regex]::match($string, $pattern).Groups[1].Value
$result | Out-File -FilePath 'C:\ResponseOnly.txt'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...