我正在创建一个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
发布于 2019-05-30 05:18:40
这比您预期的要容易,因为您拥有的输入内容是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'
https://stackoverflow.com/questions/56368400
复制相似问题