Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Упростить скрипт (http://forum.oszone.net/showthread.php?t=354772)

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"


YuS_2 09-01-2024 08:21 3022447

Technik_spat,
Образец файла потребуется...
И желательно описание того, что в итоге требуется получить, а лучше образец того, что будет на входе и что необходимо получить на выходе...

Technik_spat 09-01-2024 09:03 3022448

Сама задача:
из файла ITOG извлечь первый и третий столбцы, используя ключевые строки из файла amark_sgtin.txt
Во вложении обрезанные файлы и как должен выглядить файл вывода (out.txt)
Файл 169499
Файл 169500
Файл 169501

YuS_2 09-01-2024 10:26 3022451

Цитата:

Цитата Technik_spat
Сама задача »

В такой постановке задачи, с данными примерами...
Наверное, так:
Код:

$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
но наоборот.

YuS_2 09-01-2024 11:58 3022454

Цитата:

Цитата Technik_spat
В pwsh 7 не захотел »

В нем тоже проверялся, версия 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))


YuS_2 09-01-2024 13:41 3022460

Цитата:

Цитата 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 »


YuS_2 09-01-2024 14:20 3022464

Хмм, :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


YuS_2 12-01-2024 12:37 3022602

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.

Время: 05:33.
© OSzone.net 2001-