读取含带双引号表头的CSV文件时无法获取指定字段值求助
解决Ruby CSV读取带双引号表头字段的问题
看起来你遇到的问题是CSV表头里的"IP Address"字段因为引号的原因无法正常读取,核心是你设置的quote_char参数干扰了CSV解析器的正常行为。我来给你拆解一下原因和解决方案:
问题原因分析
你设置了:quote_char => "\x00"(空字符),这相当于告诉Ruby的CSV库“不使用任何引号字符”。但你的CSV表头里的"IP Address"是标准CSV格式——因为字段名包含空格,所以用双引号包裹。当你关闭了引号解析后,CSV库会把首尾的双引号当成字段名的一部分,也就是解析后的字段名实际是"IP Address"(包含双引号),而不是你预期的IP Address。
你尝试的row['\"IP Address\"']之所以无效,是因为在Ruby的单引号字符串里,\会被当作普通字符,所以这个字符串实际是\"IP Address\"(带反斜杠),和解析后的字段名不匹配,自然读不到值。
解决方案
方案1:移除错误的quote_char设置(推荐)
你的CSV是符合标准格式的,带空格的字段名用双引号包裹是CSV的规范写法,所以直接去掉:quote_char => "\x00"参数,让CSV库默认处理引号即可:
CSV.foreach(vcenter_vnetwork_file, headers: true) do |row| puts row['VM'] puts row['IP Address'] # 现在可以正常读取了 end
CSV库会自动识别表头里的双引号,把里面的IP Address作为字段名,这样你就能直接用row['IP Address']读取对应的值。
方案2:保留quote_char设置时的正确写法
如果你因为特殊需求必须保留:quote_char => "\x00",那你需要使用包含双引号的字段名来读取,注意用单引号直接包裹带双引号的字段名:
CSV.foreach(vcenter_vnetwork_file, headers: true, :quote_char => "\x00") do |row| puts row['VM'] puts row['"IP Address"'] # 直接匹配解析后的带引号字段名 end
这样就能精准匹配到解析后的字段名,读取到对应的值。
内容的提问来源于stack exchange,提问作者codec
相关产品推荐
相关产品推荐

