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

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

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

Всем привет, нужна помощь в распарсовке 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 мин... плюс к этому прока идёт процесс форма зависает, пробовал с много поточностью то ошибка с прогрес баром то что нельзя его исправлять в другом потоке то ещё что-то... в итоге вот что у меня получилось с много поточностью, то ошибки то потоки не помогают и всё равно зависают формы...:
Листинг программы
  1. richTextBox1.Text = System.IO.File.ReadAllText(FileXML);
  2. Status.Text = "Файл открыт";
  3. StatusProc.Text = "100%";
  4.  
  5. string text1 = "";
  6. string Ot = "";
  7. private void ObrFileToolStripMenuItem_Click(object sender, EventArgs e)
  8. {
  9. text1 = richTextBox1.Text;
  10. Status.Text = "Обработка файла.";
  11. obr();
  12. }
  13. public async void obr()
  14. {
  15. progressBar1.Value = 0;
  16. StatusProc.Text = "0%";
  17. progressBar1.Maximum = text1.Length - 1;
  18. for (int j = 0; j < text1.Length; j++)
  19. {
  20. Ot += await ooo(text1[j]);
  21. progressBar1.Value += 1;
  22. double a = j / (Convert.ToInt32(text1.Length - 1) / 100);
  23. StatusProc.Text = Convert.ToString(Math.Round(a, 2)) + "%";
  24. }
  25. string[] Otext = Ot.Split('^');
  26. Status.Text = "Вывод обработанного файла.";
  27. obrV(Otext);
  28. }
  29. public Task<string> ooo(char text1)
  30. {
  31. string t = "";
  32. return Task.Run(() =>
  33. {
  34. if (text1 == '<')
  35. {
  36. t += "^";
  37. }
  38. if (text1 == '>')
  39. {
  40. t += text1 + "^";
  41. }
  42. else
  43. t += text1;
  44. return t;
  45. });
  46. }
  47. public async void obrV(string[] Otext)
  48. {
  49. StatusProc.Text = "0%";
  50. progressBar1.Maximum = Otext.Length - 1;
  51. progressBar1.Value = 0;
  52. for (int i = 0; i < Otext.Length; i++)
  53. {
  54. richTextBox2.Text += await aaa(Otext[i]);
  55. //progressBar1.Value += 1;
  56. double a = i / (Convert.ToInt32(text1.Length - 1) / 100);
  57. StatusProc.Text = Convert.ToString(Math.Round(a, 2)) + "%";
  58. }
  59. }
  60. static Task<string> aaa(string Otext)
  61. {
  62. string oo = "";
  63. return Task.Run(() =>
  64. {
  65. oo += Otext + "\n";
  66. return oo;
  67. });
  68. }
А вот это рабочий код без потоков с зависанием формы и тд
Листинг программы
  1. public void pars()
  2. {
  3. textBox1.Clear();
  4. listBox1.Items.Clear();
  5. string text1 = System.IO.File.ReadAllText(file);
  6. textBox1.Text = text1;
  7. string text = "";
  8. progressBar1.Maximum = text1.Length - 1;
  9. progressBar1.Value = 0;
  10. for (int j = 0; j < text1.Length - 1; j++)
  11. {
  12. if (text1[j] == '<')
  13. {
  14. text += '^';
  15. }
  16. if (text1[j] == '>')
  17. {
  18. text += text1[j];
  19. text += '^';
  20. }
  21. else
  22. {
  23. text += text1[j];
  24. }
  25. progressBar1.Value += 1;
  26. }
  27. string[] Otext = text.Split('^');
  28. progressBar3.Maximum = Otext.Length;
  29. progressBar3.Value = 0;
  30. for (int i = 0; i < Otext.Length; i++)
  31. {
  32. listBox1.Items.Add(Otext[i]);
  33. progressBar3.Value += 1;
  34. }
  35. otvettext = Otext;
  36. obrob();
  37. }
Спасибо, знаю код гнилой, сами шарпы подзабыл...

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

textual
Листинг программы
  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"/>

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут