#powershell-3.0
#powershell-3.0
Вопрос:
Я заблокирован своим сценарием PowerShell… это занимает слишком много времени для выполнения работы. Пожалуйста, мне нужна ваша помощь, чтобы использовать лучший метод для удаления большого количества строк в файле.
Я объясняю контекст :
Я ввел два файла. Файл1: список номеров клиентов и действий, которые выглядят так :
- 730;12345678
- 710;11223344
- 732;89898989
- (и т.д.)
Этот файл заполняется пользователем, поэтому он может содержать 10 строк или 1000 строк
Я добавил этот файл в список массивов :
$MyArrayList = New-Object -TypeName "System.Collections.ArrayList"
$File1 = get-content "file1.txt"
foreach($Client in $File1)
{
$DetailClient = $Client.split(";")
$NumAct = $DetailClient[0]
$NumClient = $DetailClient[1]
$MyArrayList.Add($NumAct)
$MyArrayList.Add($NumClient)
}
File2: это потоковый файл, содержащий 100 000 строк (в среднем), выглядит так
LP RC05808 094100008832970954001000088329 12345678 000006
UO RC05808 094107 13596710435866 CAR 000001001000001
UO RC05808 094109 COP 000013001000013
UO RC05808 094110 PAL 000013011000143
LT RC05808 09410000000207700000003190PE0109202015092020R730
LT RC05808 09410000000207700000003190PE0109202015092020R720
LR RC05808 094124082020150920202 002 000000170000V N 720 2133 01CAR
UL RC05808 09412 002 CAR 07 102 В
LR RC05808 094124082020150920202 003 000000060000V N 720 2133 01CAR
UL RC05808 09412 003 CAR 07 36 В
LR RC05808 094124082020150920202 004 000000050000V N 730 2133 01CAR
UL RC05808 09412 003 003 car 004 АВТОМОБИЛЬ 07 30 В
LR RC05808 094124082020150920202 005 000000100000 В N 730 2133 01 АВТОМОБИЛЬ
UL RC05808 09412 005 АВТОМОБИЛЬ 07 60 В
В этом файле мне нужно выполнить для каждого сопоставленного клиента, сохранить его для создания другого файла и удалить его в этом файле, например: для каждой строки LP проверьте, присутствует ли номер клиента в file1, если да, посмотрите в строке LT, присутствует ли активность этого клиента в файлеи если да, удалите его, затем, если да, удалите все строки LR с номером activite и каждую следующую строку UL
Для каждой удаленной строки мне нужно сохранить некоторую информацию (в этом примере сохраните 000006, 004, 005, 30, 60 для строк LP, UL и LR) для создания csv-файла.
Надеюсь, понятно: S
Я попытался полностью прочитать file2 и сохранить всю информацию, а затем прочитать второй раз file2 для удаления строк :
$File2 = get-content "file2.txt"
$SaveOPC = New-Object -TypeName "System.Collections.ArrayList"
foreach($Fope in $File2)
{
$Typeline = $Fope.substring(0,2)
IF($Typeline -eq "LP")
{
$ClientLP = $Fope.substring(58,8)
IF($MyArrayList.Contains($ClientLP))
{
$empAct = (($MyArrayList.IndexOf($ClientLP)) -1)
$arrayAct = $MyArrayList.Item($emplacementAct)
$Keyline = $Fope.substring(3,21)
$SaveOPC.Add($Keyline)
$SaveOPC.Add($arrayAct)
}
}
#[...] i do other task for every case but not useful for here
}
#delete line, it's here my problem, it's very long...
for($i=0; $i -lt $SaveOPC.count;$i=$i 2)
{
$key = $SaveOPC.Item($i)
$act = $SaveOPC.Item($i 1)
$regexlrlt = '^(LR|LT) (' $key ').*' $act '.*n(UL) (' $key ').*'
(Get-Content "file2.txt" -Raw) -replace $regexlrlt, '' | Set-Content 'file2.txt'
}
# next i delete emply line
(Get-Content "file2.txt") | ? {$_.trim() -ne "" } | Set-Content "file2.txt"
#[...] then i build csv file
в этом примере номер клиента 12345678 совпадает с file1, поэтому я должен удалить строку LT с 730, строку LR с 730 и следующую строку UL
Итак, моя проблема в том, как быстрее всего удалить все совпадающие строки… я пробовал построчно, по регулярному выражению, по номеру строки и т. Д. Заранее спасибо