Присматриваясь некоторое время, я нашел довольно много дискуссий о том, как определить количество строк в файле.
Например, эти три:
С# как подсчитывать строки в текстовом файле
Определить количество строк в текстовом файле
Как быстро считать строки?
Итак, я пошел вперед и в итоге использовал то, что кажется самым эффективным (по крайней мере, с точки зрения памяти?) методом, который я мог найти:
private static int countFileLines(string filePath)
{
using (StreamReader r = new StreamReader(filePath))
{
int i = 0;
while (r.ReadLine() != null)
{
i++;
}
return i;
}
}
Но это берет навсегда, когда сами строки из файла очень длинны. Действительно ли это не более быстрое решение?
Я пытаюсь использовать StreamReader.Read()
или StreamReader.Peek()
, но я не могу (или не знаю, как сделать), чтобы любой из них перешел к следующей строке, как только "stuff" ( chars? text?).
Любые идеи, пожалуйста?
ЗАКЛЮЧЕНИЕ/РЕЗУЛЬТАТЫ (после выполнения некоторых тестов на основе предоставленных ответов):
Я тестировал 5 методов ниже на двух разных файлах, и я получил согласованные результаты, которые, как представляется, указывают на то, что простой старый StreamReader.ReadLine()
по-прежнему остается одним из самых быстрых способов... Честно говоря, я озадачен после всех комментариев и обсуждение в ответах.
Файл # 1:
Размер: 3,631 КБ
Линии: 56,870
Результаты в секундах для файла №1:
0.02 → Метод ReadLine.
0,04 → Метод чтения.
0.29 → Метод ReadByte.
0.25 → Метод Readlines.Count.
0.04 → Метод ReadWithBufferSize.
Файл # 2:
Размер: 14,499 КБ
Линии: 213 424
Результаты в секундах для файла №1:
0.08 → Метод ReadLine.
0.19 → Метод чтения.
1.15 → Метод ReadByte.
1.02 → Метод Readlines.Count.
0.08 → Метод ReadWithBufferSize.
Вот 5 методов, которые я тестировал на основе всех полученных мной отзывов:
private static int countWithReadLine(string filePath)
{
using (StreamReader r = new StreamReader(filePath))
{
int i = 0;
while (r.ReadLine() != null)
{
i++;
}
return i;
}
}
private static int countWithRead(string filePath)
{
using (StreamReader _reader = new StreamReader(filePath))
{
int c = 0, count = 0;
while ((c = _reader.Read()) != -1)
{
if (c == 10)
{
count++;
}
}
return count;
}
}
private static int countWithReadByte(string filePath)
{
using (Stream s = new FileStream(filePath, FileMode.Open))
{
int i = 0;
int b;
b = s.ReadByte();
while (b >= 0)
{
if (b == 10)
{
i++;
}
b = s.ReadByte();
}
return i;
}
}
private static int countWithReadLinesCount(string filePath)
{
return File.ReadLines(filePath).Count();
}
private static int countWithReadAndBufferSize(string filePath)
{
int bufferSize = 512;
using (Stream s = new FileStream(filePath, FileMode.Open))
{
int i = 0;
byte[] b = new byte[bufferSize];
int n = 0;
n = s.Read(b, 0, bufferSize);
while (n > 0)
{
i += countByteLines(b, n);
n = s.Read(b, 0, bufferSize);
}
return i;
}
}
private static int countByteLines(byte[] b, int n)
{
int i = 0;
for (int j = 0; j < n; j++)
{
if (b[j] == 10)
{
i++;
}
}
return i;
}