Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
85 / 1 / 0
Регистрация: 22.02.2016
Сообщений: 103

Необходимо проанализировать большие текстовые файлы

25.01.2021, 11:51. Показов 1278. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Подскажите, как лучше реализовать задачу, по анализу всех файлов в папке и подпапках с регулярными выражениями.
Насколько я понял есть 3 способа:
1. Воспользоваться LINQ, но в нем нельзя использовать регулярные выражения.
2. Использовать regex, а потом match.success построчно.
3. Использовать contains.

т.к. файлы могут быть большого размера, доходя до 2 Гб или больше, то необходимо 1. использовать using или AsParallel в linq.
но встает вопрос в том, что если производить вывод найденных ошибок, то зависает основной поток, хоть пробовал с using.

Хочу сделать:
1. Найти все файлы в каталоге и подкаталогах по маске (может быть .log и .txt и тд).
2. Проанализировать все файлы через регулярные выражения, которые задаются во время работы программы (то есть не compiler).
3. если в файле найдена ошибка, есть совпадение, то 1. скопировать исходный файл, где ошибка и 2. в отдельный файл собрать все ошибки.
4. опциально выводить ошибки в реальном времени, по мере нахождения. Для этого не должен блокироваться основной поток.

Пробовал using, но есть зависание textbox, долго разбирается и полагаю это не многопоточный анализ или не паралельное.
Есть идеи, как реализовать быстрый анализ больших текстовых файлов?
P.S пока реализовываю на WinForm, но думаю и из консольного примера переведу на form
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.01.2021, 11:51
Ответы с готовыми решениями:

Чем открывать большие текстовые файлы?
Здравствуйте! Можете посоветовать, чем открывать большие текстовые файлы(лог)? Сейчас я подгружаю в richtextbox через ssh 1000/5000...

Определить строки этого файла, содержащие максимальную по длине подстроку, состоящую из одинаковых символов
вот задание для программы: 6. Задан текстовый файл input.txt. Требуется определить строки этого файла, содержащие максимальную по длине...

Текстовые файлы, посчитать матрицы и вывести в текстовые файлы
Доброго дня суток. Прошу у вас помощи с заданием:) В текстовом файле записаны матрицы A(4x4), B(3x3), C(5x5). Прибавить к диагональным...

7
Эксперт .NET
 Аватар для Usaga
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,435
25.01.2021, 12:01
Цитата Сообщение от dj-12l Посмотреть сообщение
Пробовал using
Это ключевое слово вы как связали с многопоточностью и чтением текста?)

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

Ну и чтобы UI не зависал нужно тяжёлые операции производить в отдельном потоке.
0
85 / 1 / 0
Регистрация: 22.02.2016
Сообщений: 103
25.01.2021, 13:54  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
е видя кода
На данный момент, есть только это:

C#
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
       private string ConvertRegex()
        {   // конвертация введенных регулярных выражений в TextBox. 
            string IdOrder = Convert.ToString(TextBox1.Text.Trim());
            string RegexTextbox = IdOrder.Replace("\r\n", "");
            return RegexTextbox;
        }
 
 
        void Outputtext(string path)
        {
            string line;
 
            //Получение файлов из пути вписанного в textbox
            foreach (string file in Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories))
            {
                string regextemp = ConvertRegex();
                Regex regex = new Regex(regextemp);
 
                //using для независания основного потока. 
                using (StreamReader reader = new StreamReader(Path.GetFullPath(file))) {
                    while ((line = reader.ReadLine()) != null)
                    {
                        Match match regex.Match(line);
                        if (match.Success)
                        {
                            //тут что делать со строкой. например вывожу:
                            textbox2.Text += line;
 
                        }
                    }
                }
            }
        }

Следовательно тут я не реализовал запись в файл, проверку на ошибки. Застрял на нормальном чтении файлов.
0
 Аватар для JustinTime
964 / 582 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
25.01.2021, 14:15
Цитата Сообщение от dj-12l Посмотреть сообщение
//using для независания основного потока.
это где вам такое сказали? по моей информации using вызывает Dispose для reader.
0
Эксперт .NET
 Аватар для Usaga
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,435
25.01.2021, 15:21
Цитата Сообщение от dj-12l Посмотреть сообщение
string IdOrder = Convert.ToString(TextBox1.Text.Trim());
Строка, которую возвращает Trim() не достаточно строковая оказалась?)

По всему остальному: можно попробовать распараллелить процесс поиска, но самое тяжелое тут именно процесс чтения с накопителя. Не факт, что распараллеливание этого процесса даст существенный прирост производительности.
0
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
25.01.2021, 16:25
Цитата Сообщение от Usaga Посмотреть сообщение
но самое тяжелое тут именно процесс чтения с накопителя. Не факт, что распараллеливание этого процесса даст существенный прирост производительности.
Скорее будет наоборот, если диск не заточен под работу с многопоточкой. Хотя даже если дисковая подсистема рассчитана на подобную нагрузку, все равно можно ее замучить. Лучше читать в один поток.

Цитата Сообщение от dj-12l Посмотреть сообщение
//using для независания основного потока.
В c# using это либо директива, либо оператор. Директива используется для пространств имен, например using System;, или как директива с псевдонимом, например using My = System.Console; и потом можно написать My.WriteLine("hello world");. Оператор using используется для правильного использования объектов, реализующих IDisposable. То есть вместо StreamReader reader = new StreamReader и потом reader.Close() вы оборачиваете ридер в юзинг. Для "независания основного потока" используйте async/await и Invoke для передачи данных в основной поток, например в текстбокс.
По поводу общего быстродействия - регулярки намного тяжелее выполняются, если есть возможность обойтись без них, то лучше без них, особенно на таком огромном количестве данных. Либо почитайте про кэширование регулярок https://docs.microsoft.com/ru-... xpressions
Можно подготовить какие-то определенные регулярки и скомпилировать их в сборку, типа:
C#
1
Regex regex1 = new Regex("[^a-zA-Z&-]+", RegexOptions.Compiled);
0
Эксперт .NET
 Аватар для Usaga
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,435
25.01.2021, 16:29
Цитата Сообщение от randok Посмотреть сообщение
Скорее будет наоборот, если диск не заточен под работу с многопоточкой. Хотя даже если дисковая подсистема рассчитана на подобную нагрузку, все равно можно ее замучить. Лучше читать в один поток.
На самом деле чтение в один поток не отменяет многопоточности при поиске подстроки. Можно реализовать Producer-Consumer: читаем построчно в один поток и раскидываем по "воркерам" не ожидая ответа. Вот это будет достаточно производительно, без чрезмерной нагрузки на накопитель.
0
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
25.01.2021, 16:32
Цитата Сообщение от Usaga Посмотреть сообщение
Можно реализовать Producer-Consumer: читаем построчно в один поток и раскидываем по "воркерам" не ожидая ответа.
Да, это вариант, но скорее всего все как обычно упрется в диск и все будут его ждать. Либо в воркерах должно что-то такое крутиться, что сильно превышает чтение с диска по времени выполнения, тогда будет смысл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.01.2021, 16:32
Помогаю со студенческими работами здесь

Необходимо проанализировать подпоследовательности из подряд идущих чисел
Вводится последовательность натуральных чисел. Признак конца ввода - ноль. Необходимо проанализировать подпоследовательности из подряд...

Файлы. Как просматривать большие файлы полностью и в любую сторону
Всем добрый вечер, скажите кто знает, как в паскале при работе с фаилами, просматривать большие фаилы полностью и в любую сторону? А то...

Почему не отправляются файлы docx, txt и прочие текстовые файлы?
Архивы и картинки проверял- отправляются на сервер, а текстовые файлы- нет. Что нужно, чтоб они тоже отправлялись? <?php ...

Текстовые файлы. Создать новый файл, объединив исходные файлы
даны текстовые файлы Name1 и Name2 .создать Name3 файл объединив Name1 и Name2 текстовые файлы

Как проанализировать файлы-отчёты со сведениями об ошибках?
Приветствую друзья;) Вот, у меня при рендеринге во время монтажа через Enter - не происходит ничего и сам процесс...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru