ruby – 为什么当返回非String时,CSV :: HeaderConverters会停止
为什么
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的开销.您正在处理的文件越大,消除的开销就越大. 这是我收到的电子邮件回复:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |