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

Узнай цену своей работы

Формулировка задачи:

Всем привет, нужна помощь в распарсовке XML документа, документ огромных размеров, все теги и содержимое в одной строке, нужно распасить всю строку и получить всё содержимое в разбитом виде в массиве. тоесть сам документ имеет структуру:
<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 мин... плюс к этому прока идёт процесс форма зависает, пробовал с много поточностью то ошибка с прогрес баром то что нельзя его исправлять в другом потоке то ещё что-то... в итоге вот что у меня получилось с много поточностью, то ошибки то потоки не помогают и всё равно зависают формы...:
           
            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"/>

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5