Быстрый способ подсчитать количество строк, удовлетворяющих условию - 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;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д