加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 为什么当返回非String时,CSV :: HeaderConverters会停止

发布时间:2020-12-16 21:06:52 所属栏目:百科 来源:网络整理
导读:为什么 header converters的处理会从头转换器返回的第一个非String停止? 细节 触发内置:符号标头转换器后,将不会处理其他转换器.看起来标头转换器的处理在第一个转换器停止时返回任何不是String的内容(即,如果你编写一个返回Fixnum或其他任何内容的自定义
为什么 header converters的处理会从头转换器返回的第一个非String停止?

细节

触发内置:符号标头转换器后,将不会处理其他转换器.看起来标头转换器的处理在第一个转换器停止时返回任何不是String的内容(即,如果你编写一个返回Fixnum或其他任何内容的自定义标头转换器,则相同的行为).

此代码按预期工作,抛出异常:throw_an_exception

require 'csv'

CSV::HeaderConverters[:throw_an_exception] = lambda do |header|
  raise 'Exception triggered.'
end

csv_str = "Numbersn" +
          "1n" +
          "4n" +
          "7"

puts CSV.parse(
  csv_str,{
    headers: true,header_converters: [
      :throw_an_exception,:symbol
    ]
  }
)

但是,如果切换标头转换器的顺序以便:符号转换器首先出现,则永远不会调用:throw_an_exception lambda.

...

header_converters: [
  :symbol,:throw_an_exception
]

...

解决方法

所以我伸手到 JEG2.

我当时认为转换器应该是链中的一系列步骤,其中所有元素都应该贯穿每一步.事实上,这不是最好地使用CSV库的方法,特别是如果您有大量数据.

它应该被使用的方式(这是“为什么”问题的答案以及为什么这对性能更好的解释)是让转换器像一系列匹配器一样工作,其中第一个匹配的转换器返回非字符串,向CSV库指示当前值已成功转换.执行此操作时,解析器可以在非String时立即停止,然后转到下一个header / cell值.

通过这种方式,您可以在解析CSV数据时删除TON的开销.您正在处理的文件越大,消除的开销就越大.

这是我收到的电子邮件回复:

The converters are basically a pipeline of conversions to try. Let’s say you’re using two converters,one for dates and one for numbers. Without a linked line,we would try both for every field. However,we know a couple of things:

  • An unconverterd CSV field is a String,because that’s how we read it in
  • A field that is now a non-String,has been converted,so we can stop searching for a converter that matches.

Given that,the optimization helps our example skip checking the number converter if we already have a Date object.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读