【问题标题】:Count all characters in file during reading CSV在读取 CSV 期间计算文件中的所有字符
【发布时间】:2020-11-02 10:31:53
【问题描述】:

我只是想问你是否有可能在读取 CSV 文件的过程中获取文件中所有字符的数量?我不想将文件加载到内存中两次(一次用于解析,第二次用于计数)。

我需要解析 CSV 文件,但还需要获取此文件中所有字符的数量(带分隔符)。有人知道如何以最有效的方式做到这一点吗?

   using (TextReader stream = new StreamReader(file.OpenReadStream()))
   {
        CsvReader reader = new CsvReader(stream, GetCsvReaderOptions());
        while (reader.Read())
        {
             //parsing
        }
   }
  • 有一个选项可以遍历实际阅读器行中的所有字段 最后以分隔符增加长度(字段数== 分隔符数)。

  • 我也有想法通过反射计算解析对象上的字符 (从对象中获取所有属性值)。

我认为这些选项不会有效。

提前致谢

【问题讨论】:

  • 请定义:“字符”。你个人认为这意味着什么?与 Unicode 联盟相比,您认为 .NET CLR 对它的定义是什么?请注意,UTF-16 Char 与单个离散字形不同。连字呢?还是在非规范化 Unicode 的情况下?
  • @Dai 我想我的意思是文件中的任何字符(数字、字母、特殊字符、空格)
  • @Mateusz 这正是 Dai 的意思。在计算“字符”之前,您需要考虑提出的要点。

标签: c# asp.net-core csvhelper


【解决方案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;
    }
    

    因此变量“长度”将包含传递文件中所有符号的计数

    【讨论】:

    • 我需要第二次打开同一个文件的流,因为如果我将 ReadToEnd() 和 CsvReader 在同一个 using 块中,在触发 ReadToEnd() 后,EndOfStream 将设置为 true。另外我认为这不会是最有效的。感谢您的回复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 2014-04-26
    • 2018-05-27
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    相关资源
    最近更新 更多