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

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

Uragan66 29-06-2024 09:13 3028553

Сортировка e-mail по доменам
 
Всем привет!
Имеется текстовый файл, содержащий строки с адресами e-mail. К примеру, такого содержания:

Код:

felix.doebele@web.de:Привет
romina.wilhelm@web.de:Как дела?
katrin.wink@gmx.de:Когда приедешь?
arnold@vfw.de:Я дома
beatebeauty@freenet.de:Завтра буду

Пытаюсь отсортировать строки по доменам e-mail. Такой код:

Код:

$addresses = @()
Get-Content .\test.txt -Encoding utf8 | % {
  $n = $($_ -split '@')[0]
  $d = $($_ -split '@')[1]
  $o = New-Object PSObject -property @{name=$n;domain=$d;email=$_}
  $addresses += ,$o
}
$addresses | sort domain,name | select -ExpandProperty email

работает правильно, сортирует как надо. На выходе:

Код:

beatebeauty@freenet.de:Завтра буду
katrin.wink@gmx.de:Когда приедешь?
arnold@vfw.de:Я дома
romina.wilhelm@web.de:Как дела?
felix.doebele@web.de:Привет

Но очень уж долго. Особенно на больших файлах.
Может кто подскажет, как можно оптимизировать код для более продуктивного решения этой задачи ? Заранее благодарен за помощь и подсказки!

YuS_2 29-06-2024 10:06 3028555

Код:

$f = 'test.txt'
(gc $f -enc utf8 -raw) -split "`n"|sort{($_ -split '@')[1]}


Uragan66 29-06-2024 14:13 3028563

YuS_2, спасибо большое! Ваш код работает гораздо быстрее.

Sham 29-06-2024 16:12 3028568

Литеральные массивы не используют для динамического заполнения. В итерации каждый раз создаётся новый массив, а старый остаётся в памяти до уборки мусора. Как минимум массив нужен динамический, например $addresses = [Collections.ArrayList]::new(), который заполняется в итерации [void]$addresses.add($o).

YuS_2 30-06-2024 10:36 3028599

Цитата:

Цитата Sham
[Collections.ArrayList] »

дополню:
От ArrayList отказываются в пользу универсального List[]
Код:

using namespace System.Collections.Generic
$lst1 =[list[int]]@(1,2,3)
$lst2 =[list[object]]@(1,2,'abc')

ну и раз уж речь зашла о массивах, то:
всё, что вы хотели знать о массивах


Время: 12:52.

Время: 12:52.
© OSzone.net 2001-