使用Smarter CSV解析制表符分隔文件时表头被合并为单个长表头
问题原因
SmarterCSV的解析配置参数被错误传递给了File.open方法。Ruby内置的文件打开方法仅识别文件路径、读写模式、权限相关参数,传入的CSV解析规则会被直接忽略,导致SmarterCSV.process始终使用默认配置(默认列分隔符为英文逗号)运行,完全没有应用自定义分隔符规则,因此会把整行表头、整行内容都识别为单个字段。
此前显式设置col_sep: "\t"未生效,原因完全一致:参数没有传递给真正负责解析的SmarterCSV.process方法。输出中出现的合并超长键date_total_time,是SmarterCSV将整行表头字符串"Date\tTotal Time"按默认规则(转小写、空格替换为下划线、转Symbol)处理生成的,和表头转换逻辑本身无关。
修复方法
将所有SmarterCSV相关配置参数从File.open入参中移出,作为第二个参数传入SmarterCSV.process:
File.open(file, "r:bom|utf-8") do |f| chunk = SmarterCSV.process( f, col_sep: "\t", row_sep: :auto, auto_row_sep_chars: 500, force_simple_split: true, strip_chars_from_headers: /[\-"]/ ) puts chunk end
执行后得到正确解析结果:
[{:date=>"2017-09-06", :total_time=>1.1}]
也可直接将文件路径传入SmarterCSV.process,省去手动打开文件的步骤,库会自动处理文件读取、BOM编码识别逻辑:
chunk = SmarterCSV.process( file, col_sep: "\t", row_sep: :auto, auto_row_sep_chars: 500, force_simple_split: true, strip_chars_from_headers: /[\-"]/ ) puts chunk
内容的提问来源于stack exchange,提问作者Arel
相关产品推荐
相关产品推荐

