Форум программистов, компьютерный форум, киберфорум
.NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
145 / 113 / 9
Регистрация: 12.09.2011
Сообщений: 770
1

Подсчет количества одинаковых строк в текстовом файле

16.05.2020, 00:32. Показов 1058. Ответов 25
Метки нет (Все метки)

Привет всем!

Подскажите, пожалуйста, возможно ли средствами .NET (C# или VB) в текстовом файле с огромным количеством строк посчитать все количества повторений каждой строки по типу: строка такая-то - 10 раз, строка такая-то - 27 раз и так далее? Кроме того, необходимо удалить все повторения той или иной строки. Очень важно, чтобы сам исходный текстовый файл не загружался в память по типу File.ReadAllLines. Целый день бьюсь и ничего толкового не получается. Возможно вообще такое без загрузки всего файла в память?

Спасибо!

Добавлено через 4 минуты
Может быть как-то возможно для каждой строки из файла формировать какое-то уникальное число? Есть в .NET такая функция?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2020, 00:32
Ответы с готовыми решениями:

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

Определение количества строк в текстовом файле и считывание заданной строки
Как определить количество строк в файле .txt и считать n-ную строку?

Подсчёт количества строк в текстовом файле
Создать текстовый файл с произвольным текстом и через меню предусмотреть следующие действия: 1)...

Подсчет количества строк в текстовом файле
Здравствуйте, есть 2 файлика Excel. Необходимо написать скрипт, который подсчитывал бы кол-во...

25
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
16.05.2020, 03:44 2
грузите файл reader'ом и составляйте массив строк. при каждом следующем считывании проверяйте наличие уже добавленной строки в массив и если совпадает, то счетчик +1 и естесственно добавление не делаем.
В итоге у вас выйдет массив с уникальными строками (каждой по одному экземпляру) и информация по количеству дубликатов... А там уже думайте что дальше с этими строками делать.
1
145 / 113 / 9
Регистрация: 12.09.2011
Сообщений: 770
16.05.2020, 12:45  [ТС] 3
Yury Komar, спасибо! Дело в том, что я так и делал, но в файле порядка 190 миллионов строк (комбинации по 7 чисел через запятую) и такое решение крайне долго работает, если проверять наличие уже добавленной строки. Я попробовал делать некое подобие контрольной суммы Int32 всех семи чисел в строке и точно также проверять наличие уже не всей строки, а именно этой суммы, и именно вот тогда процесс идет во много раз быстрее. Загвоздка в том, что суммы-то получаются не уникальные, то есть разные комбинации конечно могут иметь одинаковые суммы.

Подскажите, пожалуйста, есть ли какой-то метод в .NET по типу хэша для строки или семи целых чисел от 1 до 70, но чтобы этот метод давал уникальное число не превышающее Int32?

Спасибо!
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
16.05.2020, 14:20 4
Vinemax, MD5 попробуйте

Добавлено через 1 минуту
так процесс генерации хэша тоже занимает ресурсы

Добавлено через 1 минуту
вам в любом случае саму строку читать предется, чтоб хэш создать
1
145 / 113 / 9
Регистрация: 12.09.2011
Сообщений: 770
16.05.2020, 14:37  [ТС] 5
Yury Komar, нет, ну само чтение этих 190 миллионов строк через StreamReader из файла идёт довольно быстро. А не подскажете, как с помощью MD5 получить именно число Int32 в качестве хэша? А то погуглил и нашел только генерации байтовых массивов таким образом.
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
16.05.2020, 16:06 6
Vinemax, int32 - не подскажу, можно например, подобие хэш: сумма байт + сумма количества символов или самих байт.. получится целое число.

Добавлено через 1 минуту
а можно ваш файл с 190.000.000 строк увидеть? у себя попробую поиграться. Если конечно инфа не конфиденциальная.
1
145 / 113 / 9
Регистрация: 12.09.2011
Сообщений: 770
16.05.2020, 16:39  [ТС] 7
Yury Komar, этот файл в архиве 438 мегабайт занимает. Здесь наверное не получится прикрепить.
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
16.05.2020, 17:05 8
Vinemax, точно, не подумал об этом. ну ладно, попробую смоделировать с меньшим количеством строк
1
145 / 113 / 9
Регистрация: 12.09.2011
Сообщений: 770
16.05.2020, 17:14  [ТС] 9
Yury Komar, попробовал, как вы сказали, но уникальных результатов совсем мало получилось - 421 всего, значит суммы всё-таки повторяются.
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
16.05.2020, 18:02 10
Цитата Сообщение от Vinemax Посмотреть сообщение
чтение этих 190 миллионов строк через StreamReader из файла идёт довольно быстро
что для вас считается быстро, в контексте данной задачи?

просто у меня на простой прогон 6,000,000 строк (без каких либо манипуляций с ними) ушло ~ 25 секунд,
соответственно 190,000,000 прогонит примерно за 13-15 минут... Это Довольно быстро для вас?
А дальнейшие действия с каждой полученной строкой будут и того больше времени занимать.

Добавлено через 5 минут
Цитата Сообщение от Vinemax Посмотреть сообщение
но уникальных результатов совсем мало получилось
а вам известно количество повторений в столь большом файле, откуда такие сомнения про слишком малую уникальность?

Добавлено через 56 секунд
и что это вообще за такой огромный файл? что в нем, если не секрет...
1
145 / 113 / 9
Регистрация: 12.09.2011
Сообщений: 770
16.05.2020, 18:10  [ТС] 11
Yury Komar, мне и не нужно молниеносно, пусть весь процесс хотя бы минут 20 идет, но не часы. Вот сейчас прогнал просто на предмет чтения всех 190 миллионов строк и у меня это заняло ровно 50 секунд. Читал в BackgroundWorker'е вот так:

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Using reader As New StreamReader(fileName, Encoding.Default)
 
    Dim line As String = reader.ReadLine, n As Integer = 0
 
    While line IsNot Nothing
 
        n += 1
 
        If (n Mod 100000) = 0 Then BackgroundWorker1.ReportProgress(n)
 
        line = reader.ReadLine
 
    End While
 
    BackgroundWorker1.ReportProgress(n)
 
End Using
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using (StreamReader reader = new StreamReader(fileName, Encoding.Default)) {
 
    string line = reader.ReadLine;
    int n = 0;
 
    while (line != null) {
 
        n += 1;
 
        if ((n % 100000) == 0) BackgroundWorker1.ReportProgress(n);
 
        line = reader.ReadLine;
    }
 
    BackgroundWorker1.ReportProgress(n);
}
Добавлено через 1 минуту
Кстати, процессор довольно старый у меня - Intel Core 2 Duo E8500 3.16 Ггц
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
16.05.2020, 18:11 12
Цитата Сообщение от Vinemax Посмотреть сообщение
Читал в BackgroundWorker'е
а, а я гонял в основном потоке, может быть отсюда такая задержка
1
145 / 113 / 9
Регистрация: 12.09.2011
Сообщений: 770
16.05.2020, 19:15  [ТС] 13
Цитата Сообщение от Yury Komar Посмотреть сообщение
а вам известно количество повторений в столь большом файле, откуда такие сомнения про слишком малую уникальность?
В этом плане у меня изначально генерируются все комбинации по 7 чисел из 17 чисел. И вот на каждые 17 чисел приходится всегда ровно 19448 уникальных комбинаций. То есть, уже факт в том, что в результате последующей обработки с подсчетом повторений комбинаций должно быть больше 19448, а у меня только 348 получается.

Добавлено через 55 секунд
Цитата Сообщение от Yury Komar Посмотреть сообщение
а я гонял в основном потоке, может быть отсюда такая задержка
возможно

Добавлено через 6 минут
вот блин! на первый взгляд такая простая задача подсчитать все повторения в файле, а уже второй день бьюсь и не могу сделать

Добавлено через 52 минуты
Yury Komar, тут суть в том, что есть изначально файл примерно из 10 тысяч строк, в каждой строке - последовательность из 17 чисел через запятую, каждое из которых не меньше 1 и не больше 70. Все числа в последовательности идут всегда в порядке возрастания. Из каждой такой последовательности нужно получить все возможные уникальные комбинации по 7 чисел и тоже в порядке возрастания. И сохранить все эти комбинации с количеством повторений каждой в файл. Формирование такого файла со всеми комбинациями у меня занимает несколько минут, то есть не долго. В итоге файл весит 3.96 Гигабайт и содержит больше 190 миллионов строк.

И вот конечная задача это удалить из этого файла все повторяющиеся комбинации с подсчетом количества повторений каждой.

Вы с VB дружите? Могу передать вам то, что сделал - сам проект Visual Studio 2019. Если вам интересно...
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
16.05.2020, 19:23 14
Цитата Сообщение от Vinemax Посмотреть сообщение
Вы с VB дружите?
с ним только и дружу. В шарпе плаваю еще, а с VB знаком хорошо.
Отправьте конечно.
1
145 / 113 / 9
Регистрация: 12.09.2011
Сообщений: 770
16.05.2020, 19:35  [ТС] 15
Я тоже сугубо на VB делаю, в C# "плаваю", как и вы ))

Вот проект... Всё, что закоментировано, это я пробую пересчитывать комбинации...
1
Вложения
Тип файла: zip Combinations.zip (677.9 Кб, 5 просмотров)
145 / 113 / 9
Регистрация: 12.09.2011
Сообщений: 770
16.05.2020, 19:37  [ТС] 16
Там в архиве собственно папка с проектом и сам файл с изначальными последовательностями. Проект можно сразу запустить, он формирует все возможные комбинации сейчас, то есть тот файл, который вы просили передать.
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
16.05.2020, 19:45 17
Vinemax, ok

я посмотрю и отпишусь, но уже не сегодня. у меня поздно и спать пойду. Если не горит, подождите.
1
145 / 113 / 9
Регистрация: 12.09.2011
Сообщений: 770
16.05.2020, 19:56  [ТС] 18
Yury Komar, да, конечно. Вы, видимо, где-то на самом востоке России? Бо у нас в Украине еще 19:53 )

Добавлено через 2 минуты
Если сможете как-то решить мою задачу, с меня небольшой презент, обещаю!
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
16.05.2020, 20:10 19
Цитата Сообщение от Vinemax Посмотреть сообщение
с меня небольшой презент, обещаю!
это необязательно...
Цитата Сообщение от Vinemax Посмотреть сообщение
Вы, видимо, где-то на самом востоке России?
Да. Владивосток.
А сейчас в море (на работе) возле Гонконга.

Вобщем ничего не обещаю, но посмотрю что смогу.
1
308 / 316 / 119
Регистрация: 29.10.2011
Сообщений: 1,003
17.05.2020, 11:58 20
Цитата Сообщение от Vinemax Посмотреть сообщение
суть в том, что есть изначально файл примерно из 10 тысяч строк, в каждой строке - последовательность из 17 чисел через запятую, каждое из которых не меньше 1 и не больше 70. Все числа в последовательности идут всегда в порядке возрастания. Из каждой такой последовательности нужно получить все возможные уникальные комбинации по 7 чисел и тоже в порядке возрастания. И сохранить все эти комбинации с количеством повторений каждой в файл. Формирование такого файла со всеми комбинациями у меня занимает несколько минут, то есть не долго. В итоге файл весит 3.96 Гигабайт и содержит больше 190 миллионов строк.
И вот конечная задача это удалить из этого файла все повторяющиеся комбинации с подсчетом количества повторений каждой.
Вы делаете это для себя или это учебная/рабочая задача? Если первое, то можно методом грубой силы, как вы сейчас и делаете, а если второе, то, на мой взгляд, эту задачу нужно задавать в разделе математика. Из программирования здесь только парсинг текстового файла из 10к строк в бинарный файл состоящий из двумерного массива byte[17, lineCount] и последующая обработка этого массива каким-то алгоритмом. Именно этот алгоритм и является краеугольным камнем в решении вашей задачи
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2020, 11:58

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Подсчет количества строк в текстовом файле, имя которого задано первым параметром КФ. Проверить наличие указа
Подсчет количества строк в текстовом файле, имя которого задано первым параметром КФ. Проверить...

Подсчет количества слов в текстовом файле
Подсчет количества слов в текстовом файле, содержащем целые числа и слова русского и английского...

Подсчет количества слов в текстовом файле
Дан текстовый файл. Составить программу, подсчитывающую количество слов в файле.

Подсчет количества абзацев в текстовом файле
здравствуйте!!помогите пожалуйста решить задачу!!мне дан текстовый файл,нужно посчитать в нем...

Подсчет количества слов в текстовом файле
Добрый день! Помогите пожалуйста написать Батник: Подсчет количества слов в текстовом файле,...

Подсчет количества предложений в текстовом файле
Сама задача:Подсчитать число предложений в заданном текстовом файле (текст на английском языке)....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.