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

Парсинг, регулярные выражения с большим объёмом и многопоточностью

15.07.2016, 10:21. Показов 8275. Ответов 12

Студворк — интернет-сервис помощи студентам
Всем привет, нужна помощь в распарсовке XML документа, документ огромных размеров, все теги и содержимое в одной строке, нужно распасить всю строку и получить всё содержимое в разбитом виде в массиве.
тоесть сам документ имеет структуру:
XML
1
<w:rPr><w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/></w:rPr></w:pPr><w:r w:rsidRPr="00EE05A1"><w:rPr><w:rFonts w:ascii="Arial" w:eastAsia="Arial" w:hAnsi="Arial" w:cs="Arial"/><w:b/><w:sz w:val="16"/><w:szCs w:val="16"/></w:rPr><w:t>Наименование работ</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="775" w:type="dxa"/><w:vMerge w:val="restart"/><w:tcBorders><w:top w:val="single" w:sz="4" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="4" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="4" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="4" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="CCFFCC"/><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="00C84A83" w:rsidRPr="00EE05A1" w:rsidRDefault="00C84A83" w:rsidP="00C30353"><w:pPr><w:spacing w:after="0" w:line="240" w:lineRule="auto"/><w:ind w:right="57"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/></w:rPr></w:pPr><w:r w:rsidRPr="00EE05A1"><w:rPr><w:rFonts w:ascii="Arial" w:eastAsia="Arial" w:hAnsi="Arial" w:cs="Arial"/><w:b/><w:sz w:val="16"/><w:szCs w:val="16"/></w:rPr><w:t>Тираж, экз.</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="751" w:type="dxa"/><w:vMerge w:val="restart"/><w:tcBorders><w:top w:val="single" w:sz="4" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="4" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="4" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="CCFFCC"/><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="00C84A83" w:rsidRPr="00EE05A1" w:rsidRDefault="00C84A83" w:rsidP="00C30353"><w:pPr><w:spacing w:after="0" w:line="240" w:lineRule="auto"/><w:ind w:right="57"/><w:jc w:val="center"/>
это кусок... вида <тег><тег>Текст<тег><тег><тег>Текст<тег> </тег></тег></тег>Текст</тег></тег>Текст</тег>
нужно разбить его в массив, чтобы туда попали и теги и текст без потерь символов, пробовал сплитить не помогло терял переменные, второй шаг был добавить определённый символ перед и после тегов, что дало возможность расплитить всю строку, но данный метод выполняется приличнео времени... файл размером в 1м обрабатывается примерно 6-8 мин...
плюс к этому прока идёт процесс форма зависает, пробовал с много поточностью то ошибка с прогрес баром то что нельзя его исправлять в другом потоке то ещё что-то...
в итоге вот что у меня получилось с много поточностью, то ошибки то потоки не помогают и всё равно зависают формы...:
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
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
           
            richTextBox1.Text = System.IO.File.ReadAllText(FileXML);
            Status.Text = "Файл открыт";
            StatusProc.Text = "100%";
 
 
        
        string text1 = "";
        string Ot = "";
        private void ObrFileToolStripMenuItem_Click(object sender, EventArgs e)
        {
            text1 = richTextBox1.Text;
            Status.Text = "Обработка файла.";
            obr();   
        }
        public async void obr()
        {
            progressBar1.Value = 0;
            StatusProc.Text = "0%";
            progressBar1.Maximum = text1.Length - 1;
            for (int j = 0; j < text1.Length; j++)
            {
                Ot += await ooo(text1[j]);
                progressBar1.Value += 1;
                double a = j / (Convert.ToInt32(text1.Length - 1) / 100);
                StatusProc.Text = Convert.ToString(Math.Round(a, 2)) + "%";
            }
            string[] Otext = Ot.Split('^');
 
            Status.Text = "Вывод обработанного файла.";
 
            obrV(Otext);
        }
        public Task<string> ooo(char text1)
        {
            string t = "";
            return Task.Run(() =>
            {
                if (text1 == '<')
                {
                    t += "^";
                }
                if (text1 == '>')
                {
                    t += text1 + "^";
                }
                else
                t += text1;
                return t;
            });
        }
 
        public async void obrV(string[] Otext)
        {
            StatusProc.Text = "0%";
            progressBar1.Maximum = Otext.Length - 1;
            progressBar1.Value = 0;
            for (int i = 0; i < Otext.Length; i++)
            {
                richTextBox2.Text += await aaa(Otext[i]);
                //progressBar1.Value += 1;
                double a = i / (Convert.ToInt32(text1.Length - 1) / 100);
                StatusProc.Text = Convert.ToString(Math.Round(a, 2)) + "%";
            }
 
        }
        static Task<string> aaa(string Otext)
        {
            string oo = "";
            return Task.Run(() =>
            {
                    oo += Otext + "\n";
                return oo;
            });
        }
А вот это рабочий код без потоков с зависанием формы и тд
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
37
38
39
40
41
public void pars()
        {
            textBox1.Clear();
            listBox1.Items.Clear();
 
            string text1 = System.IO.File.ReadAllText(file);
            textBox1.Text = text1;
            string text = "";
            progressBar1.Maximum = text1.Length - 1;
            progressBar1.Value = 0;
            for (int j = 0; j < text1.Length - 1; j++)
            {
 
                if (text1[j] == '<')
                {
                    text += '^';
                }
                if (text1[j] == '>')
                {
                    text += text1[j];
                    text += '^';
                }
                else
                {
                    text += text1[j];
                }
                progressBar1.Value += 1;
            }
 
            string[] Otext = text.Split('^');
            progressBar3.Maximum = Otext.Length;
            progressBar3.Value = 0;
            for (int i = 0; i < Otext.Length; i++)
            {
                listBox1.Items.Add(Otext[i]);
                progressBar3.Value += 1;
            }
            otvettext = Otext;
 
             obrob();
        }
Спасибо, знаю код гнилой, сами шарпы подзабыл...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.07.2016, 10:21
Ответы с готовыми решениями:

Парсинг: регулярные выражения
Здравствуйте! Пытаюсь распарсить текст на слова и знаки пунктуации. Текст распарсил, и осталось только отделить слова, от занков...

Регулярные выражения (Парсинг)
Как отпарсить строку &quot;{\&quot;response\&quot;: Как выделить эту цифру? 142396579 Мне нужен лишь шаблон. Вот я такой пишу string pattern =...

Регулярные выражения, парсинг
Ребята, помогите пожалуйста состряпать пару регулярок для парсинга текста. Надо из этого : { &quot;24h_avg&quot;: 763.11, ...

12
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,307
15.07.2016, 10:25
Bulbash554, выброси этот ужас и посмотри в сторону XPath или XML-сериализации.
0
1 / 1 / 0
Регистрация: 24.02.2014
Сообщений: 19
15.07.2016, 10:37  [ТС]
Usaga, в дело в том что содержимого XML не возможно предугадать, помимо того что в работе с файлом нужен не только текст но так и сами теги, Сама XML это документ Word, тегами разбиты переменные которые необходимо склеить...
для этого и нужно получить документ в виде массива для упрощённой работы...
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,307
15.07.2016, 11:38
Bulbash554, XPath как раз-таки про это.

Добавлено через 1 минуту
XPath позволит тебе за один запрос получить коллекцию объектов отвечающих твоим требованиям.
0
1 / 1 / 0
Регистрация: 24.02.2014
Сообщений: 19
15.07.2016, 12:28  [ТС]
Usaga, попробовал, что-то нечего дельного не получилось да и особо не знаком с этим...
то что попробовал выгрузить выгрузило как одну сплошную строку...
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,307
15.07.2016, 12:30
Цитата Сообщение от Bulbash554 Посмотреть сообщение
то что попробовал выгрузить выгрузило как одну сплошную строку...
Значит запрос такой составил.
0
1 / 1 / 0
Регистрация: 24.02.2014
Сообщений: 19
15.07.2016, 12:31  [ТС]
Usaga, можешь помочь разобраться ?
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,307
15.07.2016, 13:14
Bulbash554, приведи пример XML-документа, и пример результата, который нужно получить (желательно с описанием).
0
1 / 1 / 0
Регистрация: 24.02.2014
Сообщений: 19
15.07.2016, 14:05  [ТС]
Теги в файле могут быть разные, а так же весь код xml в одну строку, тоесть :
XML
1
    <w:rPr><w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/></w:rPr></w:pPr><w:r w:rsidRPr="00EE05A1"><w:rPr><w:rFonts w:ascii="Arial" w:eastAsia="Arial" w:hAnsi="Arial" w:cs="Arial"/><w:b/><w:sz w:val="16"/><w:szCs w:val="16"/></w:rPr><w:t>Наименование работ</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="775" w:type="dxa"/><w:vMerge w:val="restart"/><w:tcBorders><w:top w:val="single" w:sz="4" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="4" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="4" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="4" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="CCFFCC"/><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="00C84A83" w:rsidRPr="00EE05A1" w:rsidRDefault="00C84A83" w:rsidP="00C30353"><w:pPr><w:spacing w:after="0" w:line="240" w:lineRule="auto"/><w:ind w:right="57"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/></w:rPr></w:pPr><w:r w:rsidRPr="00EE05A1"><w:rPr><w:rFonts w:ascii="Arial" w:eastAsia="Arial" w:hAnsi="Arial" w:cs="Arial"/><w:b/><w:sz w:val="16"/><w:szCs w:val="16"/></w:rPr><w:t>Тираж, экз.</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="751" w:type="dxa"/><w:vMerge w:val="restart"/><w:tcBorders><w:top w:val="single" w:sz="4" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="4" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="4" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="CCFFCC"/><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="00C84A83" w:rsidRPr="00EE05A1" w:rsidRDefault="00C84A83" w:rsidP="00C30353"><w:pPr><w:spacing w:after="0" w:line="240" w:lineRule="auto"/><w:ind w:right="57"/><w:jc w:val="center"/>
Итог в идеальном случае это каждый тег и каждый текст между тегами должен быть разбит в массив каждый тег в отдельной ячейке как и текст
Ещё раз повторюсь что xml в одну строку
Чуток позже могу скинуть скрины
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,307
15.07.2016, 14:18
Bulbash554, то, что XML в одну строку вообще ни на что не влияет. То, что теги разные могут быть - и ежу понятно. Критерии поиска какие?
0
1 / 1 / 0
Регистрация: 24.02.2014
Сообщений: 19
15.07.2016, 14:20  [ТС]
Парсится полностью все. Выборок не должно быть
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,307
15.07.2016, 14:31
Bulbash554, тогда выходом будет загрузка всего документа и построение на его основе DOM. С полученной моделью можно будет делать всё, что душа пожелает (обходить, видоизменять, дополнять). Так поступает сам Word.

Начать копать можно с класса XDocument.

Добавлено через 3 минуты
Кстати, для работы с DOCX-документами существует такая классная штука как OpenXML SDK.
1
1 / 1 / 0
Регистрация: 24.02.2014
Сообщений: 19
15.07.2016, 14:37  [ТС]
Окай, спасибо, изучу отпишусь)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.07.2016, 14:37
Помогаю со студенческими работами здесь

Парсинг [регулярные выражения]
Нужно из таких строк: 23.08 | 17:51 | Nick: Petia_Voloshuk | Dialog: Don_Pedro | Server: 5.254.105.203:7777 Diamond Role Play |...

Парсинг через регулярные выражения
Посмотрите пожалуйста код.В нем происходит поиск в исходном коде страницы. Найти надо идентификатор товара из цифр. Находятся эти цифры по...

Регулярные выражения. Парсинг блоков
Всем привет! Пытаюсь написать регулярное выражение для решения следующей задачи: в некотором файле имеются блоки. Каждый блок имеет...

Регулярные выражения. Парсинг html
Доброго времени суток, уважаемые форумчане! Есть задача вытащить ссылки из html-файла. Первая мысль: &quot;Регулярные выражения,...

Регулярные выражения. Парсинг текстовых файлов
Прошу пример парсинга например, 2-го слова фразы &quot;hello world 2018&quot;. Вроде бы просто, но никак не выходит. int main() { ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru