Парсинг, регулярные выражения с большим объёмом и многопоточностью - C#
Формулировка задачи:
Всем привет, нужна помощь в распарсовке XML документа, документ огромных размеров, все теги и содержимое в одной строке, нужно распасить всю строку и получить всё содержимое в разбитом виде в массиве.
тоесть сам документ имеет структуру:
это кусок... вида <тег><тег>Текст<тег><тег><тег>Текст<тег></тег></тег></тег>Текст</тег></тег>Текст</тег>
нужно разбить его в массив, чтобы туда попали и теги и текст без потерь символов, пробовал сплитить не помогло терял переменные, второй шаг был добавить определённый символ перед и после тегов, что дало возможность расплитить всю строку, но данный метод выполняется приличнео времени... файл размером в 1м обрабатывается примерно 6-8 мин...
плюс к этому прока идёт процесс форма зависает, пробовал с много поточностью то ошибка с прогрес баром то что нельзя его исправлять в другом потоке то ещё что-то...
в итоге вот что у меня получилось с много поточностью, то ошибки то потоки не помогают и всё равно зависают формы...:
А вот это рабочий код без потоков с зависанием формы и тд
Спасибо, знаю код гнилой, сами шарпы подзабыл...
Листинг программы
- <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"/>
Листинг программы
- 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;
- });
- }
Листинг программы
- 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();
- }
Решение задачи: «Парсинг, регулярные выражения с большим объёмом и многопоточностью»
textual
Листинг программы
- <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"/>
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д