Быстрый способ подсчитать количество строк, удовлетворяющих условию - C#
Формулировка задачи:
Здравствуйте, подскажите пожалуйста быстрый способ подсчитать количество строк удовлетворяющих условию в очень большом текстовом файле. суть вопроса: код делит исходный файл на несколько файлов по признаку - наличие строки "$$$$" (к примеру в исходном файле 100 строк "$$$$", я хочу поделить файл так, чтобы в каждом было по 50 строк "$$$$"). для того чтобы отображать ход процесса на прогрессбаре надо знать изначальное количество строк "$$$$",
я это делаю стримридером, но так выходит очень долго.
может есть какой-то более быстрый путь?
заранее спасибо!
private void backgroundWorker6_DoWork(object sender, DoWorkEventArgs e) { string @out = openFileDialog7.FileName.Replace(".sdf", ""); string @in = openFileDialog7.FileName; int flnmbr = 0, stcnt = 0, stcnt6 = 0, splstrcnt, structureshavealreadyread6 = 0; string line; if (textBox14.Text != "") { splstrcnt = Convert.ToInt32(textBox14.Text); StreamWriter writer = new StreamWriter(@out + "-" + filenumber[0] + ".sdf"); //filenumber[0] = 01 Invoke(new MethodInvoker(delegate { textBox15.AppendText("\r\n" + DateTime.Now.ToString("HH:mm:ss") + "< " + @out + "-" + filenumber[flnmbr] + ".sdf"); })); using (StreamReader sr6 = new StreamReader(@in, Encoding.Default)) //считаем количество блоков $$$$ в исходном файле { string line6; while ((line6 = sr6.ReadLine()) != null)//читаем до конца файла { if (line6.Contains("$$$$")) { stcnt6++; //количество блоков $$$$ в исходном файле } } } using (StreamReader sr = new StreamReader(@in, Encoding.Default)) //читаем файл { while (sr.Peek() > -1 /*(line = sr.ReadLine()) != null*/)//читаем до конца файла { line = sr.ReadLine(); writer.WriteLine(line); if (line.Contains("$$$$")) { stcnt++; if ((stcnt % 50) == 0 && stcnt != 0) //проверка сколько блоков уже записано в файл, чтобы другие записывать в следующий файл и т.д. { flnmbr++; writer.Close(); if (sr.Peek() > -1)//если это последняя строка то новый файл не создаем { writer = new StreamWriter(@out + "-" + filenumber[flnmbr] + ".sdf"); Invoke(new MethodInvoker(delegate { textBox15.AppendText("\r\n" + DateTime.Now.ToString("HH:mm:ss") + "< " + @out + "-" + filenumber[flnmbr] + ".sdf"); })); } } } if (line == "$$$$") { structureshavealreadyread6++; int process = (structureshavealreadyread6 * 100) / stcnt6; if (process % 2 == 0) { backgroundWorker6.ReportProgress(process); } } } writer.Close(); //закрываем Writer Invoke(new MethodInvoker(delegate { textBox15.AppendText("\r\n" + DateTime.Now.ToString("HH:mm:ss") + "< SDF processing finished in: " + timer11 + "\r\nSDF has " + stcnt + " structures\r\n\r\n"); })); MessageBox.Show("Splitting finished", "SDF", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else { MessageBox.Show("Enter number structures per file", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); textBox14.Focus(); } }
Решение задачи: «Быстрый способ подсчитать количество строк, удовлетворяющих условию»
textual
Листинг программы
myProgressBar.Style = ProgressBarStyle.Marquee;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д