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