Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
50 / 49 / 3
Регистрация: 27.07.2019
Сообщений: 459

Выбор из большого списка текстовых строк только с разными регистрами

09.06.2025, 14:50. Показов 3185. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые форумчане, добрый день!
Очень нужна помощь в совсем непраздном вопросе (разрабы кассового ПО забыли про сканеры штрих-кодов, если они на cbd, то чувствительны к клавише caps lock и теперь надо найти все ошибки марок, которые не выбыли и-за замены регистра):
есть много файлов со строками, в которых много повторяющихся данных, но, среди них иногда могут попадаться такие же, но с инвертированными регистрами, примерно так:
01046100177028712100CN8IGD5VTE8
01046100177028712100ZAE8TSVCZUY
01046100177028712100DB6J1634PCB
01046100177028712100ZAE9TFGJKNE
01046100177028712100ZAE9TFGJKNE
01046100177028712100ZAE9TFGJKNE
01046100177028712100zae9tfgjkne

Вот как раз нижняя строка показывает то, что надо найти.
Сама проблема, найти в файлах повторения с разными регистрами и как то их выкинуть в отдельный файл, либо удалить не повторяющиеся с различным регистром данные.
Т.е. в итоге должно остаться:
01046100177028712100ZAE9TFGJKNE
01046100177028712100zae9tfgjkne

Во вложенеии файл с маленькой выборкой, в нём я с ходу нашел (визуально):
01046100177028712100ZAE9TFGJKNE
01046100177028712100zae9tfgjkne

01046100177028712100ydzg14b69n2
01046100177028712100YDZG14B69N2

010366558500391321TWD8NC2MX5ND1
010366558500391321twd8nc2mx5nd1

05.txt
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.06.2025, 14:50
Ответы с готовыми решениями:

Добавление разных строк из текстового файла в конец других файлов в определённом порядке
Исходные данные: 1. есть 10 текстовых файлов (file1.txt, file2.txt, ..., file10.txt) 2. есть...

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

Пакетное создание копий заданного файла с разными именами из списка в текстовом файле
Всем доброго. Стоит следующая задача: 1. Есть файл (picture.png), есть текстовый файл...

28
2798 / 497 / 119
Регистрация: 26.09.2020
Сообщений: 942
Записей в блоге: 5
09.06.2025, 15:42
Цитата Сообщение от farmsnab Посмотреть сообщение
в итоге должно остаться
PowerShell
1
Get-Content -Path .\05.txt | Select-Object -Unique
ИИ: Давайте разберём эту строчку кода на PowerShell по частям

### 1. `Get-Content -Path .\05.txt`

- **`Get-Content`**: Это команда (или "cmdlet") в PowerShell, которая используется для чтения содержимого файлов. Она позволяет получить текст, который находится в указанном файле.

- **`-Path`**: Это параметр, который указывает путь к файлу, содержимое которого мы хотим прочитать. В данном случае, путь указан как `.\05.txt`.

- **`.\05.txt`**: Это относительный путь к файлу `05.txt`, который находится в текущей директории (обозначается `.`). То есть, если вы находитесь в папке, где находится файл `05.txt`, команда будет работать корректно.

### 2. `|`

- Этот символ называется "пайп" (pipe). Он используется для передачи вывода одной команды в качестве ввода для другой команды. В данном случае, вывод команды `Get-Content` (содержимое файла `05.txt`) передаётся следующей команде.

### 3. `Select-Object -Unique`

- **`Select-Object`**: Это ещё одна команда в PowerShell, которая используется для выбора определенных свойств объектов или для фильтрации данных.

- **`-Unique`**: Это параметр, который указывает, что мы хотим получить только уникальные (различные) значения из переданных данных. То есть, если в файле `05.txt` есть повторяющиеся строки, команда `Select-Object -Unique` оставит только одну копию каждой уникальной строки.

### Итог

Таким образом, вся команда `Get-Content -Path .\05.txt | Select-Object -Unique` делает следующее:

1. Читает содержимое файла `05.txt`.
2. Передаёт это содержимое в команду `Select-Object`.
3. Фильтрует строки, оставляя только уникальные значения.

В результате вы получите список строк из файла `05.txt`, в котором каждая строка будет представлена только один раз, даже если она встречалась в файле несколько раз.

Команда `Select-Object -Unique` в PowerShell чувствительна к регистру. Это означает, что строки, которые отличаются только по регистру, будут считаться уникальными.

Например, если в вашем файле `05.txt` есть следующие строки:

```
Hello
hello
HELLO
```

То при использовании `Select-Object -Unique` вы получите три уникальные строки:

```
Hello
hello
HELLO
```
1
50 / 49 / 3
Регистрация: 27.07.2019
Сообщений: 459
09.06.2025, 15:53  [ТС]
Это не рабочий вариант.
Вот рабочее решение:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$inputFile = "05.txt"
$outputFile = "resoulte.txt"
$lines = Get-Content -Path $inputFile
$groups = $lines | Group-Object -Property { $_.ToLower() }
$matchingGroups = $groups | Where-Object {
    $distinctStrings = $_.Group | Select-Object -Unique
    $distinctStrings.Count -gt 1
}
$output = foreach ($group in $matchingGroups) {
    "Совпадающие строки:"
    $group.Group | Select-Object -Unique
    ""
}
$output | Set-Content -Path $outputFile
В данном случае ИИ помог, но подбирал очень долго параметры задания.
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,188
09.06.2025, 19:22
Цитата Сообщение от farmsnab Посмотреть сообщение
но подбирал очень долго параметры задания.
безвнятноготзрезультатхз...

PowerShell
1
(gc 05.txt |select -uni|group|? count -gt 1).group
1
 Аватар для alhaos
1927 / 544 / 153
Регистрация: 20.02.2019
Сообщений: 2,659
Записей в блоге: 65
09.06.2025, 19:49
Лучший ответ Сообщение было отмечено farmsnab как решение

Решение

farmsnab, Если задача найти именно такие пары то можно так

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
param (
    $dataFile = ".\05.txt"
)
 
$hs = [System.Collections.Generic.HashSet[string]]::new()
 
foreach ($line in Get-Content $dataFile ) {
    $null = $hs.Add($line) 
}
 
foreach ($el1 in $hs) {
    foreach ($el2 in $hs) {
        if ($el1 -cne $el2 -and $el1 -eq $el2) {
            Write-Host $el1, $el2
        }
    }    
}
Code
1
2
3
4
5
6
01046100177028712100ZAE9TFGJKNE 01046100177028712100zae9tfgjkne
01046100177028712100zae9tfgjkne 01046100177028712100ZAE9TFGJKNE
01046100177028712100ydzg14b69n2 01046100177028712100YDZG14B69N2
01046100177028712100YDZG14B69N2 01046100177028712100ydzg14b69n2
010366558500391321TWD8NC2MX5ND1 010366558500391321twd8nc2mx5nd1
010366558500391321twd8nc2mx5nd1 010366558500391321TWD8NC2MX5ND1
1
50 / 49 / 3
Регистрация: 27.07.2019
Сообщений: 459
10.06.2025, 06:56  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
безвнятноготзрезультатхз...
Скрипт даёт такой результат:

Совпадающие строки:
0104602233007977211EVWKHGWBCKY3
0104602233007977211evwkhgwbcky3

Совпадающие строки:
010465027706014421icx5j9VE23i22
010465027706014421ICX5J9ve23I22

Совпадающие строки:
01046100177025742100C1GBLXXRK33
01046100177025742100c1gblxxrk33

Совпадающие строки:
0104605964012524211507842K95MEX
0104605964012524211507842k95mex

Добавлено через 2 минуты
Цитата Сообщение от alhaos Посмотреть сообщение
farmsnab, Если задача найти именно такие пары то можно так

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
param (
    $dataFile = ".\05.txt"
)
 
$hs = [System.Collections.Generic.HashSet[string]]::new()
 
foreach ($line in Get-Content $dataFile ) {
    $null = $hs.Add($line) 
}
 
foreach ($el1 in $hs) {
    foreach ($el2 in $hs) {
        if ($el1 -cne $el2 -and $el1 -eq $el2) {
            Write-Host $el1, $el2
        }
    }    
}
Вот это самый идеальный вариант, проще по таблицам теперь распихать на поиск ошибок)))))
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,188
10.06.2025, 08:46
Цитата Сообщение от farmsnab Посмотреть сообщение
Скрипт даёт такой результат
какой из скриптов? В моем такого быть не должно. Мой делает ровно то, что написано в Вашем первом сообщении, оставляет пары одинаковых строк с разными регистрами символов и вывод их в консоль:
Цитата Сообщение от farmsnab Посмотреть сообщение
Сама проблема, найти в файлах повторения с разными регистрами и как то их выкинуть в отдельный файл, либо удалить не повторяющиеся с различным регистром данные.
Куда их выводить - это уже вторичный вопрос, можно в файл (хоть в текст, хоть в csv или в какой-либо другой формат), можно в консоль или сразу двойной вывод...
Да и вообще, здесь главное то, что есть тот результат, который требовался... если устраивает, то и хорошо.
0
50 / 49 / 3
Регистрация: 27.07.2019
Сообщений: 459
10.06.2025, 08:57  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
какой из скриптов? В моем такого быть не должно. Мой делает ровно то, что написано в Вашем первом сообщении, оставляет пары одинаковых строк с разными регистрами символов и вывод их в консоль:

Куда их выводить - это уже вторичный вопрос, можно в файл (хоть в текст, хоть в csv или в какой-либо другой формат), можно в консоль или сразу двойной вывод...
Да и вообще, здесь главное то, что есть тот результат, который требовался... если устраивает, то и хорошо.
Нет, вывод моего скрипта))))))
Это я не правильно пост оформил)))))
Да, он выводит в файл.
В принципе, эта тема уже выполнена.

Не по теме:

Теперь долгий процесс выявления всех ошибок и много-много кофе((((.

0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,188
10.06.2025, 09:07
Цитата Сообщение от farmsnab Посмотреть сообщение
Теперь долгий процесс
чтобы он был менее долгим, можно выбрать скрипт с наиболее быстрым алгоритмом обработки (сам я не проверял, но Вам и карты в руки) и процесс может существенно сократиться по времени.
Кстати:
Цитата Сообщение от farmsnab Посмотреть сообщение
это самый идеальный вариант
этот вариант генерирует фантомные пары, т.е. те которые уже найдены, он показывает повторно, только с перестановкой места элементов с разным регистром символов.

если нужна таблица именно:
PowerShell
1
2
gc 05.txt |select -uni|group|? count -gt 1|
%{[pscustomobject]@{orig=$_.group[0];duble=$_.group[1]}}
2
2798 / 497 / 119
Регистрация: 26.09.2020
Сообщений: 942
Записей в блоге: 5
10.06.2025, 10:32
Цитата Сообщение от farmsnab Посмотреть сообщение
Вот рабочее решение:
NoComments

YuS_2, а если смешанный регистр и в группе больше элементов?
PowerShell
1
gc 05.txt|select -uni|group|? count -gt 1|%{($_.Group|sort -CaseSensitive) -join '; '}
2
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,188
10.06.2025, 12:03
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
а если смешанный регистр и в группе больше элементов?
Дык, для select - uni... до лампочки... регистр и количество полных дубликатов, т.к. он регистрозависим, поэтому останутся уникальные значения и одинаковые пары с разным регистром.
Про select -uni
Это ведь, кстати, твоя идея именно с селектом... и ты ведь с гопотой там общался, он же в разборе полетов на это указал тоже.

Далее, группировка с фильтром счетчика больше двух, уже отфильтрует фактически уникальные, которые в единственном экземпляре и оставит только одинаковые пары с разным регистром, которые и требовались в итоге. Ты запусти скрипт для проверки... получишь результат.
группировка ведь регистронезависима...
0
2798 / 497 / 119
Регистрация: 26.09.2020
Сообщений: 942
Записей в блоге: 5
10.06.2025, 13:20
YuS_2, дело не в select, дело в количестве элементов в группе, скажем при
PowerShell
1
$data = @('01046100177028712100ZAE9TFGJKNE', '01046100177028712100ZAE9TFGjkNE', '01046100177028712100zae9tfgjkne')
твой вариант выведет только два, даже если их больше.

Но я не знаю чего надо выводить, может так и надо
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,188
10.06.2025, 13:26
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
твой вариант выведет только два, даже если их больше.
Дык я и говорю, что после select -uni их, в принципе, не может быть больше двух... такшта всё нормально.
0
2798 / 497 / 119
Регистрация: 26.09.2020
Сообщений: 942
Записей в блоге: 5
10.06.2025, 13:32
Цитата Сообщение от YuS_2 Посмотреть сообщение
Дык я и говорю, что после select -uni их, в принципе, не может быть больше двух...
в тои и дело, что может. но твой код выводит 2 первых, да.
PowerShell
1
2
3
4
5
6
$data = @(
    '01046100177028712100ZAE9TFGJKNE',
    '01046100177028712100ZAE9TFGjkNE',
    '01046100177028712100zae9tfgjkne'
)
$data|select -uni|group|? count -gt 1|%{($_.Group|sort -CaseSensitive) -join '; '}
1
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,188
10.06.2025, 13:36
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
скажем при
а, вон ты про что... ну, да, выведет только первые два одинаковых с разным регистром.
Но это уже зависит от того, что требуется дальше с ними делать. Ведь, как минимум, одна пара найдена, поэтому лучше проверить именно эти значения на наличие других разнорегистровых псевдо-дублей... в общем, ТЗ надо уточнить.

Добавлено через 3 минуты
ну или да, вывести сразу все найденные, а не первые два, что гораздо лучше и менее затратно будет. Всё верно
0
 Аватар для alhaos
1927 / 544 / 153
Регистрация: 20.02.2019
Сообщений: 2,659
Записей в блоге: 65
10.06.2025, 20:32
для жалующихся на фантомные боли

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
param (
    $dataFile = ".\05.txt"
)
 
$hs = [System.Collections.Generic.HashSet[string]]::new()
 
foreach ($line in Get-Content $dataFile ) {
    $null = $hs.Add($line) 
}
 
if ($hs.Count -lt 2) {
    Write-Host "No matches found"
    exit 0 
}
 
$array = @($hs)
 
for ($i = 1; $i -lt $hs.Count; $i++) {
    for ($j = 0; $j -lt $i; $j++) {
        if ($array[$i] -cne $array[$j] -and $array[$i] -eq $array[$j]) {
            Write-Host $array[$i], $array[$j]
        }
    }
}
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,188
11.06.2025, 13:17
Лучший ответ Сообщение было отмечено farmsnab как решение

Решение

farmsnab,
Цитата Сообщение от YuS_2 Посмотреть сообщение
чтобы он был менее долгим, можно выбрать скрипт с наиболее быстрым алгоритмом обработки (сам я не проверял, но Вам и карты в руки) и процесс может существенно сократиться по времени.
тут немного отрефакторил, получился значительно более скорострельный вариант:
PowerShell
1
2
3
$file = ".\05.txt"
((gc $file -raw) -split "`n"|group -cases).name|group|? count -gt 1|
%{[pscustomobject]@{orig=$_.group[0];duble=$_.group[1..($_.count-1)]}}
плюс добавлена поддержка всех вариантов разнорегистровых дублей (т.е. поправлено то, о чем говорил iNNOKENTIY21)
1
 Аватар для alhaos
1927 / 544 / 153
Регистрация: 20.02.2019
Сообщений: 2,659
Записей в блоге: 65
13.06.2025, 09:43
для спринтеров

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
param (
    $dataFile = ".\05.txt"
)
 
$hs = [System.Collections.Generic.HashSet[string]]::new()
 
$reader = [System.IO.StreamReader]::new($dataFile)
while ($null -ne ($line = $reader.ReadLine()) ) {
    $null = $hs.Add($line)    
}
 
$reader.Close()
$reader.Dispose()
 
if ($hs.Count -lt 2) {
    Write-Host "No matches found"
    exit 0 
}
 
$array = @($hs)
 
for ($i = 1; $i -lt $hs.Count; $i++) {
    for ($j = 0; $j -lt $i; $j++) {
        if ($array[$i] -cne $array[$j] -and $array[$i] -eq $array[$j]) {
            Write-Host $array[$i], $array[$j]
        }
    }
}
Добавлено через 43 минуты
PowerShell
1
2
3
if ($array[$i] -eq $array[$j]) {
            Write-Host $array[$i], $array[$j]
        }
убрали избыточное условие

Добавлено через 55 минут
Ну и в конечном итоге я так понимаю нас интересовали различные варианты написания строки

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
param (
    $dataFile = ".\05.txt"
)
 
$hs = [System.Collections.Generic.HashSet[string]]::new()
 
$reader = [System.IO.StreamReader]::new($dataFile)
while ($null -ne ($line = $reader.ReadLine()) ) {
    $null = $hs.Add($line)    
}
 
$reader.Close()
$reader.Dispose()
 
if ($hs.Count -lt 2) {
    Write-Host "No matches found"
    exit 0 
}
 
$array = @($hs)
 
$results = [System.Collections.Generic.Dictionary[string, System.Collections.Generic.HashSet[string]]]::new()
 
for ($i = 1; $i -lt $hs.Count; $i++) {
    for ($j = 0; $j -lt $i; $j++) {
        if ($array[$i] -eq $array[$j]) {
            if ($results.Keys.Contains(($array[$i].ToUpper()))) {
                $null = $results[$array[$i].ToUpper()].Add($array[$i])
                $null = $results[$array[$i].ToUpper()].Add($array[$j])
            }
            else {
                $results.Add($array[$i].ToUpper(), [System.Collections.Generic.HashSet[string]]::new())
                $null = $results[$array[$i].ToUpper()].Add($array[$i])
                $null = $results[$array[$i].ToUpper()].Add($array[$j])
            }
        }
    }
}
 
foreach ($resultKey in $results.Keys) {
    Write-Host "line:", "[$resultKey]", "variants:"
    foreach ($variant in $results[$resultKey]) {
        Write-Host "  -[$variant]"
    }
}
Добавлено через 56 минут
все фигня... давай по новой )))

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
param (
    $dataFile = ".\05.txt"
)
 
$t = [datetime]::Now
 
$results = @{} 
 
$reader = [System.IO.StreamReader]::new($dataFile)
while ($null -ne ($line = $reader.ReadLine()) ) {
    $upperLine = $line.ToUpper()
    if (!$results.Contains($upperLine)) {
        $results[$upperLine] = [System.Collections.Generic.HashSet[string]]::new()
        
    } 
    $null = $results[$upperLine].Add($line)
}
 
$reader.Close()
$reader.Dispose()
 
foreach ($key in $results.Keys) {
    if ($results[$key].Count -gt 1) {
        Write-Host $key
        foreach ($variant in $results[$key]) {
            Write-Host "  -", $variant
        }
    }
}
 
([datetime]::Now - $t).TotalMilliseconds
1
 Аватар для volodin661
6627 / 2258 / 346
Регистрация: 10.12.2013
Сообщений: 7,809
13.06.2025, 22:05
PowerShell
1
2
3
4
5
6
7
8
9
measure-command {
 
@"
create table t(word TEXT unique on conflict replace);
.import 05.txt t
 select word, count(word) from t GROUP by word collate nocase having count(word) > 1;
"@ | sqlite3
 
}
20 Milliseconds

Output:
010366558500391321twd8nc2mx5nd1|2
01046100177028712100ydzg14b69n2|2
01046100177028712100ZAE9TFGJKNE|2


Итак, на выходе всегда будут пары одинаковых значений но в разных регистрах
( остальные отсеются при импорте данных из текст. файла из-за декларации UNIQUE в предложении CREATE TABLE )

Как тебе такое, Илон Маск farmsnab ?
0
 Аватар для alhaos
1927 / 544 / 153
Регистрация: 20.02.2019
Сообщений: 2,659
Записей в блоге: 65
14.06.2025, 07:04
volodin661, Впечатляет, если заменить опцию уникального ограничения с replace на ignore даст еще прироста производительности

Для тестирования скопировал стоки до миллиона.

PowerShell
1
2
3
4
5
6
7
$t = [datetime]::Now
 
$file = ".\data.txt"
((gc $file -raw) -split "`n" | group -cases).name | group | ? count -gt 1 |
% { [pscustomobject]@{orig = $_.group[0]; duble = $_.group[1..($_.count - 1)] } }
 
([datetime]::Now - $t).TotalMilliseconds
Code
1
14540,9229
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
param (
    $datafile = ".\data.txt"
)
 
$t = [datetime]::Now
 
$results = @{} 
 
$reader = [System.IO.StreamReader]::new($datafile)
while ($null -ne ($line = $reader.ReadLine()) ) {
    $upperLine = $line.ToUpper()
    if (!$results.Contains($upperLine)) {
        $results[$upperLine] = [System.Collections.Generic.HashSet[string]]::new()
        
    } 
    $null = $results[$upperLine].Add($line)
}
 
$reader. Close()
$reader. Dispose()
 
foreach ($key in $results. Keys) {
    if ($results[$key].Count -gt 1) {
        Write-Host $key
        foreach ($variant in $results[$key]) {
            Write-Host "  -", $variant
        }
    }
}
 
([datetime]::Now - $t).TotalMilliseconds
Code
1
4254,755
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$command = @"
create table TMP(LINE text unique on conflict replace);
.import data.txt TMP
 
select LINE
  from (
    select LINE,
           count(*) cnt
      from TMP
     group by LINE collate nocase
    having count(*) > 1
);
"@
 
Measure-Command {
    $command | sqlite3.exe
}
Code
1
2948,8622
но если читерить внешними утилитами

то вот код утилиты, которая решает эту задачу за 473.9827ms

Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package main
 
import (
    "bufio"
    "fmt"
    "os"
    "strings"
    "sync"
    "time"
)
 
func main() {
 
    t := time.Now()
 
    const dataFile = "data.txt"
 
    file, err := os.Open(dataFile)
    if err != nil {
        panic(err)
    }
 
    defer file.Close()
 
    results := Results{
        mu:   sync.Mutex{},
        data: make(map[string]map[string]struct{}),
    }
 
    scanner := bufio.NewScanner(file)
 
    wg := sync.WaitGroup{}
 
    lines := make(chan string, 100)
 
    for range 10 {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for line := range lines {
                results.Add(line)
            }
        }()
    }
 
    for scanner.Scan() {
        lines <- scanner.Text()
    }
    close(lines)
 
    if scanner.Err() != nil {
        panic(scanner.Err())
    }
 
    wg.Wait()
 
    for line, variants := range results.data {
 
        if len(variants) < 2 {
            continue
        }
 
        fmt.Println(line)
        for variant, _ := range variants {
            fmt.Println("  -", variant)
        }
    }
 
    fmt.Println(time.Since(t))
}
 
type Results struct {
    mu   sync.Mutex
    data map[string]map[string]struct{}
}
 
func (r *Results) Add(line string) {
    defer r.mu.Unlock()
    r.mu.Lock()
    upperLine := strings.ToUpper(line)
    if r.data[upperLine] == nil {
        r.data[upperLine] = make(map[string]struct{})
    }
    r.data[upperLine][line] = struct{}{}
}
Code
1
473.9827ms
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.06.2025, 07:04
Помогаю со студенческими работами здесь

Для всех файлов, кроме текстовых, установить атрибут "Только для чтения", а для текстовых — атрибут "Архивный"
Здравствуйте, Очень прошу помочь написать мне программу. Задание:В заданной папке для всех файлов,...

Удалить переносы строк в большом текстовом файле
Доброго времени суток. Имеется огромный текстовый файл, нужно удалить все переносы строк. Было:...

Поиск в файлах строк по заданному слову и вывод найденных строк в текстовый файл
Прошу помощи, т.к. в командных файлах разбираюсь слабо. Имеется некое количество txt-файлов в...

Поменять IP-адрес и порт на взятые из списка в текстовом файле и удалить их из этого списка
Есть тхт документ в нем прокси сервера записаны в виде 192.168.1.1:3128 ; помогите написать батник....

Замена слов с учетом регистра в нескольких текстовых файлах (формат .txt)
Есть несколько текстовых файлов (формат.txt) и нужно в них заменить слова с учетом регистра. Всё...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru