Показать полную графическую версию : Упростить скрипт
Technik_spat
09-01-2024, 07:54
Уважаемые форумчане!
Вопрос непраздный , есть скрипт pwsh, но он отрабатывает очень долго (40-60 минут). Возникла идея изъять из неё функцию отбора по признаку 11 и 28 (повесил на bat/cmd, отсеивает из более 500 тыс строк до 30-35 тыс, что правильные значения), что бы попробовать ускорить процесс. Но сколько не пробовал это сделать (я про изъятие функции), так и не смог осилить, тупо не отрабатывает.
Помогите убрать функцию отбора по признакам 11 и 28, оставив только выборку по SGTIN.
$sgtin = 'G:\Test_stgin\Farm_new\amark_sgtin.txt'
$repack = 'G:\Test_stgin\Farm_new\ITOG.txt'
$out = 'G:\Test_stgin\Farm_new\out.txt'
$csvSgtin = Import-Csv -Path $sgtin -delim ';' -Header SGTIN, H, Value
$csvRepack = Import-Csv -Path $repack -delim ';' -Header SGTIN, H, Value
$a = ($csvSgtin|? Value -Match '^11$|^28$').SGTIN
$r = foreach ($i in $csvRepack) {
if ($a -eq $i.SGTIN) {$i.SGTIN+';'+$i.Value}
}
$r|Out-File $out
Remove-Item -Path "G:\Test_stgin\Farm_new\amark_sgtin.txt"
Remove-Item -Path "G:\Test_stgin\Farm_new\ITOG.txt"
Technik_spat,
Образец файла потребуется...
И желательно описание того, что в итоге требуется получить, а лучше образец того, что будет на входе и что необходимо получить на выходе...
Technik_spat
09-01-2024, 09:03
Сама задача:
из файла ITOG извлечь первый и третий столбцы, используя ключевые строки из файла amark_sgtin.txt
Во вложении обрезанные файлы и как должен выглядить файл вывода (out.txt)
169499
169500
169501
Сама задача »
В такой постановке задачи, с данными примерами...
Наверное, так:
$sgtin = 'G:\Test_stgin\Farm_new\amark_sgtin.txt'
$repack = 'G:\Test_stgin\Farm_new\ITOG.txt'
$out = 'G:\Test_stgin\Farm_new\out.txt'
$a = ((sls $sgtin -patt '\b(11|28)\b;?$').line|
convertfrom-csv -delim ';' -h SGTIN,H,Value).sgtin
$r = (sls $repack -patt $a).line|convertfrom-csv -delim ';' -h SGTIN,H,Value|
select SGTIN,Value
$param = @{}
$param.Path = $out
$param.NoTypeInformation = $true
$param.Encoding = 'UTF8'
$param.Delimiter = ';'
if ($psversiontable.psversion.major -gt 5){
$param.NoHeader = $true
$param.UseQuotes = 'AsNeeded'
}
$r|export-csv @param
- должно побыстрее работать...
Technik_spat
09-01-2024, 10:52
В pwsh 7 не захотел((((
А в 6 уже 20 минут отрабатывает.
Тут наверное проще сделать в таком алгоритме:
в файле ITOG удаление строк отсутствующих в amark_sgtin
т.е. что то аналогичное cmdfindstr /L /v /X /g:remove.txt content.txt>result.txt но наоборот.
В pwsh 7 не захотел »
В нем тоже проверялся, версия 7.4
Какую ошибку пишет?
Тут наверное проще сделать в таком алгоритме »
в cmd не проще, особенно, если будет вопрос в кодировке... а ещё особеннее, если файлы непомерного размера... :)
уже 20 минут отрабатывает. »
Ну, есть вариант ещё ускорить, если потоковое чтение файла задействовать...
DJ Mogarych
09-01-2024, 12:41
$sgtin = 'D:\temp\test_stgin\amark_sgtin.txt'
$repack = 'D:\temp\test_stgin\ITOG.txt'
$out = 'D:\temp\test_stgin\out.txt'
[regex]$repackStrings = [System.IO.File]::ReadAllLines("$sgtin") -replace ';.*' -join '|'
[regex]$replace = ';\w+|\s+'
[System.IO.File]::WriteAllLines("$out", ([System.IO.File]::ReadAllLines("$repack") -match $repackStrings -replace $replace))
[regex]$repackStrings = [System.IO.File]::ReadAllLines("$sgtin") -replace ';.*' -join '|' »
тут ведь не все строки будут использоваться:
используя ключевые строки из файла amark_sgtin.txt »
а ключ у них:
Value -Match '^11$|^28$' »
- т.е. в третьем поле должны быть эти цифры...
Technik_spat
09-01-2024, 13:49
СПАСИБО!!!
Теперь можно bat добить другие процедуры и наконец скорость пойдет)))))
DJ Mogarych
09-01-2024, 14:01
YuS_2, я так понял, что автор хотел как раз
убрать функцию отбора по признакам 11 и 28, оставив только выборку по SGTIN »
Хмм, :dont-know
Возможно...
Тогда в моем скрипте можно ускорить:
$sgtin = 'G:\Test_stgin\Farm_new\amark_sgtin.txt'
$repack = 'G:\Test_stgin\Farm_new\ITOG.txt'
$out = 'G:\Test_stgin\Farm_new\out.txt'
$a = (-split (gc $sgtin -raw)) -replace ';[^\n]+'
$r = (sls $repack -patt $a).line|convertfrom-csv -delim ';' -h SGTIN,H,Value|
select SGTIN,Value
$param = @{}
$param.Path = $out
$param.NoTypeInformation = $true
$param.Encoding = 'UTF8'
$param.Delimiter = ';'
if ($psversiontable.psversion.major -gt 5){
$param.NoHeader = $true
$param.UseQuotes = 'AsNeeded'
}
$r|export-csv @param
Technik_spat, а этот вопрос решили?
Ну, всё равно, может быть, кому-нибудь пригодится...
powershell с потоковым чтением-записью файлов:
$sgtin = 'G:\Test_stgin\Farm_new\amark_sgtin.txt'
$repack = 'G:\Test_stgin\Farm_new\ITOG.txt'
$out = 'G:\Test_stgin\Farm_new\out.txt'
$reader = [io.streamreader]::new($sgtin)
$ht = @{}
while ($reader.peek() -ne -1) {
$str = $reader.readline()
if ($str -match '\b(11|28)\b;?$'){
$ht.add($str.substring(0,$str.indexof(';')),'f')
}
}
$reader.close()
$reader = [io.streamreader]::new($repack)
$writer = [io.streamwriter]::new($out)
while ($reader.peek() -ne -1) {
$str = $reader.readline()
if ($ht[$str.substring(0,$str.indexof(';'))]){
$s = $str -split ';'
$writer.writeline($s[0] + ';' + $s[2])
}
}
$reader.close()
$writer.close()
- должен быть самый шустрый вариант (нужны реальные, большие файлы, мне проверить нечем)... хоть и с отбором по шаблону '11|28'
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.