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