Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
1 / 1 / 2
Регистрация: 02.10.2013
Сообщений: 76

обработка текста в richtextbox

02.10.2013, 21:49. Показов 3307. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет! надеюсь разделом не ошибся
Ребята написал прожку для работы, но она очень медленно работает, может подскажите как ее оптимизировать?
задача в следующем:
есть лист с повторяющимися строками:
EN300-00001
EN300-00001
EN300-00001
EN300-00001
EN300-00001
EN300-00001
EN300-00002
EN300-00002
EN300-00002
EN300-00002
EN300-00002
EN300-00002
EN300-00002
EN300-00002
EN300-00003
EN300-00003
EN300-00003
EN300-00003
EN300-00003
EN300-00003
EN300-00004
EN300-00004
EN300-00004
EN300-00004
EN300-00004
EN300-00004
EN300-00005
надо оставить лист с неповторяющимися сроками, т.е. должно остаться:
EN300-00001
EN300-00002
EN300-00003
EN300-00004
EN300-00005
причем, программа должна работать таким образом, чтобы исходный лист можно было 1)открывать из файла и 2)вставлять в текстбокс и обрабатывать из него:

1) открытие и обработка из файла работает так себе (когда 500000 строк):
C#
1
2
3
4
5
6
7
8
9
10
11
12
        private void button4_Click(object sender, EventArgs e)
        {
            openFileDialog2.Filter = "List (*.lst)|*.lst|Text files (*.txt; *.tab; *.tbl)|*.txt; *.tab; *.tbl; *.ods|All files (*.*)|*.*";
            if ((openFileDialog2.ShowDialog() == DialogResult.OK))
            {
                file11 = System.IO.File.ReadAllLines(openFileDialog2.FileName, Encoding.Default); //для обработки строк
                file2 = System.IO.File.ReadAllText(openFileDialog2.FileName, Encoding.Default); //для отображения исходного текста в richTextBox1
                richTextBox1.Text = file2; 
                label5.Visible = true;
                SQ(); // процедура обработки 
            } 
        }
2) если лист скопирован в richTextBox1: работает медленно (когда 500000 строк)
C#
1
2
3
4
5
6
7
8
9
10
        private void button5_Click(object sender, EventArgs e) //обработка из текстбокса - очень долго!!!!(((
        {
            Array.Resize(ref file11, richTextBox1.Lines.Length + 1);   //изменение размера массива под размер строк в текстбоксе
            for (int x = 0; x < richTextBox1.Lines.Length; x++)
            {
                file11[x] = richTextBox1.Lines[x]; //запись строк текстбокса в массив для обработки
            }
            SQ(); // процедура обработки 
 
        }

сама процедура обработки:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void SQ ()   
       {
           richTextBox2.Clear();
           int n = 0;
           string[] text = new string[1]; 
           text[0] = file11[0];   //первая строка по любому уникальна
           for (int i = 0; i < file11.Length; i++)  //просмотр по строкам 
                {
                    if (text[n].Equals(file11[i]))  { }  //проверка не одинаковы ли строки?
                    else if ((file11[i]) != "")   //проверка не пустая ли строка
                    {
                        n= n+1;
                        Array.Resize(ref text, text.Length + 1);  //если строки не одинаковы то увеличение размера массива на оду ячейку
                        text[n] = file11[i];     //и запись этой строки в новую ячейку массива                                                                  
                    }
                }
 
                for (int y = 0; y < text.Length; y++)
                {
                    richTextBox2.AppendText(text[y] + "\r\n");   //отображение результата
                }
                richTextBox1.Text = richTextBox1.Text.TrimEnd();
       }
казалось бы простая задача, но на больших файлах неоптимальный код сильно тормозит прожку, подскажите пожалуйста как можно оптимизировать, заранее спасибо!

Добавлено через 6 минут
не успел за 5 мин отредактировать...
C#
1
 string[] text = new string[1];  //новый массив для записи строк без повторений
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.10.2013, 21:49
Ответы с готовыми решениями:

Подсветка текста в RichTextBox
Как в RichTextBox выделеный текст окрасить в какой нибудь цвет(не через ColorDialog)?

Фон текста в RichTextBox
Помогите, пожалуйста, с такой проблемой. При использовании следующей строки: textBox2.Font = new Font(&quot;Microsoft Sans Serif&quot;,...

Отображение текста DrawString отличается от RichTextBox
Привет всем. Вступление Пишу контрол на подобие грида. Контрол содержит ряд ячеек. Активная ячейка отображается в RichTextBox,...

12
369 / 341 / 108
Регистрация: 12.02.2013
Сообщений: 653
02.10.2013, 21:56
Цитата Сообщение от tigorlab Посмотреть сообщение
надо оставить лист с неповторяющимися сроками
используй метод Distinct() в коллекции

Добавлено через 1 минуту
пример
C#
1
2
3
4
5
6
            List<string> lst = new List<string>() { "one", "one", "two" };
 
            foreach (string x in lst.Distinct()) // Выводит только 'one' и 'two'
            {
                listBox1.Items.Add(x);
            }
1
1 / 1 / 2
Регистрация: 02.10.2013
Сообщений: 76
03.10.2013, 00:51  [ТС]
отлично, спасибо!
можете пожалуйста подсказать как можно вставить строки в листбокс из Clipboard?

Добавлено через 1 час 57 минут
по Вашему совету код получился намного короче! и красивее
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
        private void SQ()
        {
            richTextBox2.Clear();             
            string[] lst1 = (from object item in richTextBox1.Lines select item.ToString()).ToArray<string>(); //запись строк текстбокса в массив
            label3.Text = lst1.Length.ToString();
            foreach (string x in lst1.Distinct()) // Выводит только уникальные записи
            {
                richTextBox2.AppendText(x + "\r\n");               
            }
            richTextBox2.Text = richTextBox2.Text.TrimEnd();
            label4.Text = richTextBox2.Lines.Length.ToString();    
        }
 
        private void button4_Click(object sender, EventArgs e)//обработка из файла
        {
            openFileDialog2.Filter = "List (*.lst)|*.lst|Text files (*.txt; *.tab; *.tbl)|*.txt; *.tab; *.tbl; *.ods|All files (*.*)|*.*";
            if ((openFileDialog2.ShowDialog() == DialogResult.OK))
            {             
                richTextBox1.Text = System.IO.File.ReadAllText(openFileDialog2.FileName, Encoding.Default); 
                richTextBox1.Text = richTextBox1.Text.TrimEnd();
                SQ();
            } 
        }
 
        private void button5_Click_1(object sender, EventArgs e)//обработка из текстбокса
        {
            SQ();
        }
но выигрыш по времени составляет всего 30 секунд по отношению к первому варианту
понимаю что основной тормоз это отображение линий в текстбоксе , листбокс ускорения не дает, может можно как то это ускорить?
0
369 / 341 / 108
Регистрация: 12.02.2013
Сообщений: 653
03.10.2013, 09:09
tigorlab, скиньте обрабатываемый файл...
1
1 / 1 / 2
Регистрация: 02.10.2013
Сообщений: 76
03.10.2013, 09:28  [ТС]
Diman777, в архиве test - файл, а в Text for SQL1.rar сама программка (все что касается этой темы находится на второй вкладке формы), спасибо за помощь!
Вложения
Тип файла: rar test.rar (112.1 Кб, 8 просмотров)
Тип файла: rar Text for SQL1.rar (80.3 Кб, 7 просмотров)
0
369 / 341 / 108
Регистрация: 12.02.2013
Сообщений: 653
03.10.2013, 10:12
tigorlab, держи, замени свой метод в проекте на этот
C#
1
2
3
4
5
6
7
8
9
10
11
        private void SQ()
        {
            richTextBox2.Clear();
 
            richTextBox2.Lines = richTextBox1.Lines.Distinct().ToArray();
 
            richTextBox2.Text = richTextBox2.Text.TrimEnd();
            label4.Text = richTextBox2.Lines.Length.ToString();
 
            MessageBox.Show("Выполнено");
        }
1
 Аватар для C17H19NO3
218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
03.10.2013, 10:48
Этот код тоже будет выполнятся долго. Вообще работа с контролами очень затратная операция, если постоянно их дергать. В виртуальной памяти все срабатывает намного быстрее.
Вот код, который делает то, что вам нужно в 2 раза быстрее чем предложил Diman777

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
34
35
36
        string[] source = null;
 
        private void SQ()
        {
            richTextBox2.Clear();
            List<string> destination = new List<string>();
            label3.Text = source.Length.ToString();
 
            foreach (string x in source.Distinct()) // Выводит только уникальные записи
            {
                destination.Add(x);
            }
 
            richTextBox2.Lines = destination.ToArray();
            label4.Text = richTextBox2.Lines.Length.ToString();
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            openFileDialog2.Filter = "List (*.lst)|*.lst|Text files (*.txt; *.tab; *.tbl)|*.txt; *.tab; *.tbl; *.ods|All files (*.*)|*.*";
            if ((openFileDialog2.ShowDialog() == DialogResult.OK))
            {
                string[] separator = { "\r\n" };
                source = System.IO.File.ReadAllText(openFileDialog2.FileName, Encoding.Default).Split(separator , StringSplitOptions.RemoveEmptyEntries);
                richTextBox1.Lines = source;
                SQ();
            }
        }
 
        private void button5_Click_1(object sender, EventArgs e)//обработка из текстбокса очень долго
        {
            if (source != null)
            {
                SQ();
            }
        }
1
1 / 1 / 2
Регистрация: 02.10.2013
Сообщений: 76
03.10.2013, 11:37  [ТС]
вот это скорость!! ребята спасибо огромное!
C17H19NO3 а за счет чего такой прирост скорости? методом, как в строке 25 быстрее заполняется массив?
а строка 15 быстро выводит данные на форму?
еще раз спасибо!!!

Добавлено через 14 секунд
вот это скорость!! ребята спасибо огромное!
C17H19NO3 а за счет чего такой прирост скорости? методом, как в строке 25 быстрее заполняется массив?
а строка 15 быстро выводит данные на форму?
еще раз спасибо!!!

Добавлено через 15 минут
Цитата Сообщение от C17H19NO3 Посмотреть сообщение
button5_Click_1
надо немного изменить,

C#
1
2
3
4
5
6
7
8
        private void button5_Click_1(object sender, EventArgs e)//обработка из текстбокса очень долго
        {
            source = (from object item in richTextBox1.Lines select item.ToString()).ToArray<string>();
            if (source != null)
            {
                SQ();
            }
        }
может пригодится кому,
0
 Аватар для C17H19NO3
218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
03.10.2013, 12:33
Скорость увеличивается за щет обработки в виртуальной памяти, удаления метода TrimToEnd() и использование контролов только для отображения.

1. Мы один раз загрузили данные в массив, а дальше оперируем данными в массиве, без обращения к какому либо контролу.
- присвоили данные первому richTextBox1
- для метода Distinct() нам не нужно обращатся к richTextBox1 (на что тратится время) и опять выгружать данные с него, они у нас уже есть в массиве "source".

2. При разбиении текста на линии, мы указали StringSplitOptions.RemoveEmptyEntries. Это значит, что наш массив "source" не будет содеражать пустых строк.
C#
1
2
    string[] separator = { "\r\n" }; //разделитель новой строки
    source = System.IO.File.ReadAllText(openFileDialog2.FileName, Encoding.Default).Split(separator , StringSplitOptions.RemoveEmptyEntries); //разделяем текст на строки и удаляем записи если строки неимеет символов
3. Метод TrimEnd() тоже долго работает, ведь он обращается к тексту контрола. Поэтом richTextBox1.Text.TrimEnd() занимает ваше дорогоценное время. Если в файле небыло лишних символов - нет смысла урезать то, чего нету.

4. Этот кусок кода тоже отработает быстрее в силу того, что мы не обращаемся 100500 раз к контролу и записываем по одной строке в него, а пишем рузультат в список "destination" (эта операция выполняется быстрее). После окончания обработки у нас есть готовая выборка данных и мы просто присваиваем эту выборку второму richTextBox.

C#
1
2
3
4
5
6
            List<string> destination = new List<string>();
            foreach (string x in source.Distinct()) // Выводит только уникальные записи
            {
                destination.Add(x);
            }
            richTextBox2.Lines = destination.ToArray();
Старайтесь как можно больше уменьшить обращение к контролам. Логика недолжна зависить от ваших контролов.
2
1 / 1 / 2
Регистрация: 02.10.2013
Сообщений: 76
03.10.2013, 12:49  [ТС]
спасибо за детальное объяснение!!!
я так понимаю что контролы это всякие текстбоксы, лейблы и т.д. - все то где отображается инфа? (вроде это гугл выдает) п.с. простите за глупый вопрос, я химик и очень далек от программирования
0
 Аватар для C17H19NO3
218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
03.10.2013, 12:59
да-да-да это они и есть.
Все что вы кидаете на форму - это и есть контролы.
Без проблем, все начинали с одного и того же, с НУЛЯ. Главное не забывать о том, какими мы были в начале.
1
369 / 341 / 108
Регистрация: 12.02.2013
Сообщений: 653
03.10.2013, 13:39
Цитата Сообщение от C17H19NO3 Посмотреть сообщение
Вообще работа с контролами очень затратная операция, если постоянно их дергать. В виртуальной памяти все срабатывает намного быстрее.
Познавательно! Как то не задумывался об этом
Можно еще кстати сократить код
Цитата Сообщение от C17H19NO3 Посмотреть сообщение
List<string> destination = new List<string>();
* * * * * * foreach (string x in source.Distinct()) // Выводит только уникальные записи
* * * * * * {
* * * * * * * * destination.Add(x);
* * * * * * }
* * * * * * richTextBox2.Lines = destination.ToArray();
на
C#
1
richTextBox2.Lines = source.Distinct().ToArray<string>();
Скорость такая же
2
1 / 1 / 2
Регистрация: 02.10.2013
Сообщений: 76
03.10.2013, 14:08  [ТС]
Diman777, C17H19NO3, огромное вам спасибо!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.10.2013, 14:08
Помогаю со студенческими работами здесь

Сохранение текста из RichTextBox с форматированием и с указанной кодировкой
Делаю текстовый редактор. Необходимо сохранять текст в файл с заданными в редакторе цветом,кодировкой и шрифтом. Использую RichTextBox....

Почиму при сохранении в базу текста из RichTextBox измененный текст перекареживает насмерть?
Вот то что записано в this.SelectedRtf - {\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fnil\fcharset204 Microsoft Sans Serif;}}...

Обработка текста
Нужно разбить текст на предложения. В большинстве случаев это получается с помощью сплита с точкой и пробелом в качестве параметра. но...

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

Обработка изображений (распознавание текста)
Здравствуйте. Задача следующая: имеется сканированный документ с рукописным текстом. Каким образом выделить строки, чтобы посчитать высоту,...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru