#c# #asp.net-core #csvhelper
#c# #asp.net-ядро #csvhelper
Вопрос:
Я просто хочу спросить вас, есть ли какие-либо возможности получить количество всех символов в файле во время чтения файла CSV? Я не хочу загружать файл в память два раза (один раз для синтаксического анализа, второй раз для подсчета).
Мне нужно проанализировать файл CSV, но также мне нужно получить количество всех символов в этом файле (с разделителями). У кого-нибудь есть идеи, как сделать это наиболее эффективным способом?
using (TextReader stream = new StreamReader(file.OpenReadStream()))
{
CsvReader reader = new CsvReader(stream, GetCsvReaderOptions());
while (reader.Read())
{
//parsing
}
}
-
Существует возможность перебирать все поля в фактической строке чтения
и в конце увеличивать длину на разделители (количество полей ==
количество разделителей). -
Также у меня есть идея подсчитать символы на анализируемых объектах путем отражения (получить все значения свойств из объекта).
Я не думаю, что эти параметры будут эффективными.
Заранее спасибо
Комментарии:
1. Пожалуйста, определите: «символ». Как вы лично думаете, что это значит? И как вы думаете, что определяет среда .NET CLR по сравнению с консорциумом Unicode? Обратите внимание, что UTF-16
Char
— это не то же самое, что один отдельный глиф. Как насчет лигатур? Или в случае денормализованного Юникода?2. @Dai Я думаю, что я имею в виду любой символ в файле (цифры, буквы, специальные символы, пробелы)
3. @Mateusz Именно это и означает Dai. Вам нужно подумать о поднятых вопросах, прежде чем считать «символы».
Ответ №1:
Вы можете использовать Reader.Context.RawRecord
и удалять окончания строк. (Предполагая, что вы не хотите их считать)
using (TextReader stream = new StreamReader(file.OpenReadStream()))
{
var count = 0;
CsvReader reader = new CsvReader(stream, GetCsvReaderOptions());
while (reader.Read())
{
count = reader.Context.RawRecord.Replace("n", "").Replace("r", "").Length;
//parsing
}
}
Ответ №2:
Основной способ сделать это может быть следующим:
using (TextReader stream = new StreamReader(file.OpenReadStream()))
{
var content = stream.ReadToEnd();
var length = content.Length;
}
Так что переменная «длина» будет содержать количество всех символов в переданном файле
Комментарии:
1. Мне нужно будет открыть поток во второй раз того же файла, потому что, если я буду ReadToEnd() с помощью CSVReader в том же блоке using, после запуска ReadToEnd() для EndOfStream будет установлено значение true . Также я не думаю, что это будет наиболее эффективно. Спасибо за ваш ответ