Быстрый способ подсчитать количество строк, удовлетворяющих условию - C#

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

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

Здравствуйте, подскажите пожалуйста быстрый способ подсчитать количество строк удовлетворяющих условию в очень большом текстовом файле. суть вопроса: код делит исходный файл на несколько файлов по признаку - наличие строки "$$$$" (к примеру в исходном файле 100 строк "$$$$", я хочу поделить файл так, чтобы в каждом было по 50 строк "$$$$"). для того чтобы отображать ход процесса на прогрессбаре надо знать изначальное количество строк "$$$$", я это делаю стримридером, но так выходит очень долго.
Листинг программы
  1. private void backgroundWorker6_DoWork(object sender, DoWorkEventArgs e)
  2. {
  3. string @out = openFileDialog7.FileName.Replace(".sdf", "");
  4. string @in = openFileDialog7.FileName;
  5. int flnmbr = 0, stcnt = 0, stcnt6 = 0, splstrcnt, structureshavealreadyread6 = 0;
  6. string line;
  7. if (textBox14.Text != "")
  8. {
  9. splstrcnt = Convert.ToInt32(textBox14.Text);
  10. StreamWriter writer = new StreamWriter(@out + "-" + filenumber[0] + ".sdf"); //filenumber[0] = 01
  11. Invoke(new MethodInvoker(delegate { textBox15.AppendText("\r\n" + DateTime.Now.ToString("HH:mm:ss") + "< " + @out + "-" + filenumber[flnmbr] + ".sdf"); }));
  12. using (StreamReader sr6 = new StreamReader(@in, Encoding.Default)) //считаем количество блоков $$$$ в исходном файле
  13. {
  14. string line6;
  15. while ((line6 = sr6.ReadLine()) != null)//читаем до конца файла
  16. {
  17. if (line6.Contains("$$$$"))
  18. {
  19. stcnt6++; //количество блоков $$$$ в исходном файле
  20. }
  21. }
  22. }
  23. using (StreamReader sr = new StreamReader(@in, Encoding.Default)) //читаем файл
  24. {
  25. while (sr.Peek() > -1 /*(line = sr.ReadLine()) != null*/)//читаем до конца файла
  26. {
  27. line = sr.ReadLine();
  28. writer.WriteLine(line);
  29. if (line.Contains("$$$$"))
  30. {
  31. stcnt++;
  32. if ((stcnt % 50) == 0 && stcnt != 0) //проверка сколько блоков уже записано в файл, чтобы другие записывать в следующий файл и т.д.
  33. {
  34. flnmbr++;
  35. writer.Close();
  36. if (sr.Peek() > -1)//если это последняя строка то новый файл не создаем
  37. {
  38. writer = new StreamWriter(@out + "-" + filenumber[flnmbr] + ".sdf");
  39. Invoke(new MethodInvoker(delegate { textBox15.AppendText("\r\n" + DateTime.Now.ToString("HH:mm:ss") + "< " + @out + "-" + filenumber[flnmbr] + ".sdf"); }));
  40. }
  41. }
  42. }
  43. if (line == "$$$$")
  44. {
  45. structureshavealreadyread6++;
  46. int process = (structureshavealreadyread6 * 100) / stcnt6;
  47. if (process % 2 == 0)
  48. {
  49. backgroundWorker6.ReportProgress(process);
  50. }
  51. }
  52. }
  53. writer.Close(); //закрываем Writer
  54. 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"); }));
  55. MessageBox.Show("Splitting finished", "SDF", MessageBoxButtons.OK, MessageBoxIcon.Information);
  56. }
  57. }
  58. else { MessageBox.Show("Enter number structures per file", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); textBox14.Focus(); }
  59. }
может есть какой-то более быстрый путь? заранее спасибо!

Решение задачи: «Быстрый способ подсчитать количество строк, удовлетворяющих условию»

textual
Листинг программы
  1. myProgressBar.Style = ProgressBarStyle.Marquee;

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


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

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

9   голосов , оценка 3.222 из 5

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

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

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