Я хотел бы получить оценку количества строк в текстовом файле csv/text, чтобы я мог использовать этот номер для индикатора выполнения. Файл может быть чрезвычайно большим, поэтому получение точного количества строк займет слишком много времени для этой цели.Получить оценку количества строк в текстовом файле
То, что я придумал ниже (читайте в части файла и подсчитать количество строк и использовать размер файла для оценки общего количества строк):
public static int GetLineCountEstimate(string file)
{
double count = 0;
using (var fs = new FileStream(file, FileMode.Open, FileAccess.Read))
{
long byteCount = fs.Length;
int maxByteCount = 524288;
if (byteCount > maxByteCount)
{
var buf = new byte[maxByteCount];
fs.Read(buf, 0, maxByteCount);
string s = System.Text.Encoding.UTF8.GetString(buf, 0, buf.Length);
count = s.Split('\n').Length * byteCount/maxByteCount;
}
else
{
var buf = new byte[byteCount];
fs.Read(buf, 0, (int)byteCount);
string s = System.Text.Encoding.UTF8.GetString(buf, 0, buf.Length);
count = s.Split('\n').Length;
}
}
return Convert.ToInt32(count);
}
Это кажется работа хорошо, но у меня есть некоторые проблемы:
1) Я хотел бы иметь свой параметр просто как Stream (в отличие от имени файла), так как я также могу читать из буфера обмена (MemoryStream). Однако Stream, похоже, не может считывать n байтов сразу в буфер или получать общую длину Stream в байтах, например FileStream. Stream - это родительский класс как для MemoryStream, так и для FileStream.
2) Я не хочу, чтобы предположить кодировку, такие как UTF8
3) Я не хочу, чтобы предположить конец строки символ (он должен работать для CR, CRLF и LF)
Буду признателен за любую помощь, чтобы сделать эту функцию более надежной.
Спасибо, но это именно то, чего я не хочу. Мне нужна оценка, а не точное количество строк. Для большого файла (1 гб) это может занять 10 и более секунд, мне нужен приблизительный метод, например, мой примерный код, который почти мгновен для больших файлов. – tjsmith