Подсчитывать все символы в файле во время чтения CSV

#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 . Также я не думаю, что это будет наиболее эффективно. Спасибо за ваш ответ