Ruby如何将文本行数据转换为嵌套二级哈希数组结构
如何将CSV格式数据转换为嵌套二级哈希数组结构
问题描述
我有如下输入数据(每行一条记录,存储在file.txt中):
Us,1,1,F Us,1,2,O Us,2,1,N Pa,1,1,S Pa,1,3,D Pa,1,5,H Pa,4,7,K
希望将其转换为嵌套的二级哈希数组结构,目标结构如下:
b = { "Us" => [ {"1" => [["1", "F"], ["2", "O"]]}, {"2" => [["1", "N"]]} ], "Pa" => [ {"1" => [["1", "S"], ["3", "D"], ["5", "H"]]}, {"4" => [["7", "K"]]} ] }
我当前编写的代码开头如下,需要帮忙完成实现:
a = Hash.new{|hsh, key| hsh[key] = []} b = Hash.new{|hsh, key| hsh[key] = []} File.readlines('file.txt').each do |line| # 这里需要补充逻辑 end
解决方案
我们可以通过分层聚合数据来实现这个结构,先按最外层的键(如Us、Pa)分组,再按第二层的键(如1、2)分组,最后整理成目标的嵌套格式。以下是完整的实现代码:
# 初始化双层默认哈希,用于暂存分组数据 data_groups = Hash.new { |h, k| h[k] = Hash.new { |h2, k2| h2[k2] = [] } } # 读取文件并处理每一行数据 File.readlines('file.txt').each do |line| # 去除换行符、按逗号分割字段,并清理每个字段的空白(处理输入中可能存在的空格) country, level1, level2, value = line.chomp.split(',').map(&:strip) # 将数据存入对应的分组 data_groups[country][level1] << [level2, value] end # 将暂存的分组数据转换为目标的嵌套结构 b = data_groups.transform_values do |level1_groups| level1_groups.map { |key, values| { key => values } } end # 可以用pp打印结果验证结构 pp b
代码解释
- 初始化分组哈希:
data_groups是一个双层默认哈希,第一层键为国家代码,第二层键为level1(如1、2),值是存储[level2, value]的数组。这种结构可以自动创建不存在的分组,省去手动判断键是否存在的麻烦。 - 处理每行数据:读取每行后,先清理换行符,再按逗号分割字段,同时用
strip处理字段中的空白(比如输入里的Pa,1,3, D),确保数据干净。之后把数据存入对应的分组中。 - 转换为目标结构:用
transform_values遍历外层哈希的每个值,把第二层的哈希转换为“哈希数组”的形式——也就是每个level1键对应一个单独的哈希元素,再把这些哈希放进数组里,完全匹配你想要的结构。
运行这段代码后,b变量就会生成你期望的嵌套二级哈希数组结构。
内容的提问来源于stack exchange,提问作者Ger Cas
相关产品推荐
相关产品推荐

