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