Войти

Показать полную графическую версию : Сортировка e-mail по доменам


Uragan66
29-06-2024, 09:13
Всем привет!
Имеется текстовый файл, содержащий строки с адресами 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
$f = 'test.txt'
(gc $f -enc utf8 -raw) -split "`n"|sort{($_ -split '@')[1]}

Uragan66
29-06-2024, 14:13
YuS_2, спасибо большое! Ваш код работает гораздо быстрее.

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

YuS_2
30-06-2024, 10:36
[Collections.ArrayList] »
дополню:
От ArrayList отказываются в пользу универсального List[]
using namespace System.Collections.Generic
$lst1 = [list[int]]@(1,2,3)
$lst2 = [list[object]]@(1,2,'abc')
ну и раз уж речь зашла о массивах, то:
всё, что вы хотели знать о массивах (https://learn.microsoft.com/ru-ru/powershell/scripting/learn/deep-dives/everything-about-arrays?view=powershell-7.4#generic-list)




© OSzone.net 2001-2012