 |
|
Technik_spat |
09-01-2024 07:54 3022446 |
Упростить скрипт
Уважаемые форумчане!
Вопрос непраздный , есть скрипт 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 3022448 |
Сама задача:
из файла 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 3022452 |
В pwsh 7 не захотел((((
А в 6 уже 20 минут отрабатывает.
Тут наверное проще сделать в таком алгоритме:
в файле ITOG удаление строк отсутствующих в amark_sgtin
т.е. что то аналогичное cmd
Код:
findstr /L /v /X /g:remove.txt content.txt>result.txt
но наоборот.
|
В нем тоже проверялся, версия 7.4
Какую ошибку пишет?
Цитата:
Цитата Technik_spat
Тут наверное проще сделать в таком алгоритме »
|
в cmd не проще, особенно, если будет вопрос в кодировке... а ещё особеннее, если файлы непомерного размера... :)
Цитата:
Цитата Technik_spat
уже 20 минут отрабатывает. »
|
Ну, есть вариант ещё ускорить, если потоковое чтение файла задействовать...
|
DJ Mogarych |
09-01-2024 12:41 3022457 |
Код:
$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))
|
Цитата:
Цитата DJ Mogarych
[regex]$repackStrings = [System.IO.File]::ReadAllLines("$sgtin") -replace ';.*' -join '|' »
|
тут ведь не все строки будут использоваться:
Цитата:
Цитата Technik_spat
используя ключевые строки из файла amark_sgtin.txt »
|
а ключ у них:
Цитата:
Цитата Technik_spat
Value -Match '^11$|^28$' »
|
- т.е. в третьем поле должны быть эти цифры...
|
Technik_spat |
09-01-2024 13:49 3022461 |
СПАСИБО!!!
Теперь можно bat добить другие процедуры и наконец скорость пойдет)))))
|
DJ Mogarych |
09-01-2024 14:01 3022462 |
YuS_2, я так понял, что автор хотел как раз
Цитата:
Цитата Technik_spat
убрать функцию отбора по признакам 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'
|
Время: 05:33.
© OSzone.net 2001-