Новичок в PowerShell и изо всех сил пытаюсь получить что-то из текстового файла.
Вот пример данных:
RD32 **MK12001** 3160 211 50 **02100123**001 SERVER LOCAL - STREET
„ ERROR MESSAGE SERVER LOCAL IS MANDATORY
RD32 **MK13103** 3160 211 50 **02100124**001 SERVER LOCAL - CITY
„ ERROR MESSAGE SERVER LOCAL IS MANDATORY
RD32 J4834-00009-92051 **MRDOOP** 3160 211 50 **021005237**001 SERVER GIVEN NAME
PETER „ ERROR MESSAGE SERVER NAME IS MANDATORY
RD32 B5509-00000-00522 **JPPK** 3160 211 50 **02123133**001 SERVER GIVEN NAME
SUNNY „ ERROR MESSAGE SERVER NAME IS MFiNDATORY
Я пытаюсь извлечь жирные поля из каждой строки.
Результат, который я ищу:
MK12001 C2100123
MK13103 C2100124
MRDOOP C21005237
JPPK C2123133
Что я получаю в настоящее время:
MK12001 3160
C2100123
MK13103 3160
C2100124
MRDOOP 3160
C21005237
JPPK 3160
C2123133
Проблема:
Поскольку я использую «3160» в качестве критерия соответствия для моего первого поля, поэтому он также отображается в результатах и для моего второго поля, которое является билетом № (C1234567), из-за использования оператора «pipe» или « второй" критерий поиска/соответствия, он будет в следующей строке. Если кто-то может помочь мне сохранить номер билета в том же поле, то я думаю, что могу жить с "3160" между ними, поэтому это будет выглядеть так
MK12001 3160 C2100123
или если кто-то может предложить мне отображать только жирные поля, т.е. до 3160, тогда это было бы здорово.
MK12001 C2100123
PS: с моим скриптом я уже меняю "0" на "C" в поле # билета (C1234567)
Вот код на данный момент:
#Location of original file
$Location = "C:\Temp\Ap8.txt"
#Location of file where the "0" is replaced with "C"
$Location2 = "C:\Temp\results9.txt"
#Final results
$Location3 = "C:\Temp\tickets9.txt"
#get the original file
$Change = Get-Content $Location
# replace C with 0
$Change | ForEach-Object {$_ -Replace "3160 311 50 0", "3160 311 50 C"} |
#write the results to staging file
Set-Content $Location2
#get the staging/udpated file
Get-Content $Location2 -Raw |
#look up for a specific fileds, I have to fetch two fields from each line therefore using pipe operator inbetween
Select-String "\s\w{1,8}\s3160| C\d{7}" -AllMatches |
% { $_.Matches.Groups.Value } |
Out-File $Location3 -Encoding ascii -Force
Решение проблемы
я действительно плохо разбираюсь в сложных шаблонах регулярных выражений, поэтому это делается с помощью строковых операторов и только очень простых шаблонов регулярных выражений. [ ухмылка ]
код...
#region >>> fake reading in a text file
# when ready to do thiw with real data, use Get-Content
$InStuff = @'
RD32 MK12001 3160 211 50 02100123001 SERVER LOCAL - STREET„ ERROR MESSAGE SERVER LOCAL IS MANDATORY
RD32 MK13103 3160 211 50 02100124001 SERVER LOCAL - CITY„ ERROR MESSAGE SERVER LOCAL IS MANDATORY
RD32 J4834-00009-92051 MRDOOP 3160 211 50 021005237001 SERVER GIVEN NAME PETER „ ERROR MESSAGE SERVER NAME IS MANDATORY
RD32 B5509-00000-00522 JPPK 3160 211 50 02123133001 SERVER GIVEN NAME SUNNY „ ERROR MESSAGE SERVER NAME IS MFiNDATORY
'@ -split [System.Environment]::NewLine
Комментариев нет:
Отправить комментарий