Быстрый способ подсчитать количество строк, удовлетворяющих условию - 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;

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


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

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

9   голосов , оценка 3.222 из 5
Похожие ответы