You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码解释

  1. 初始化分组哈希:data_groups是一个双层默认哈希,第一层键为国家代码,第二层键为level1(如1、2),值是存储[level2, value]的数组。这种结构可以自动创建不存在的分组,省去手动判断键是否存在的麻烦。
  2. 处理每行数据:读取每行后,先清理换行符,再按逗号分割字段,同时用strip处理字段中的空白(比如输入里的Pa,1,3, D),确保数据干净。之后把数据存入对应的分组中。
  3. 转换为目标结构:用transform_values遍历外层哈希的每个值,把第二层的哈希转换为“哈希数组”的形式——也就是每个level1键对应一个单独的哈希元素,再把这些哈希放进数组里,完全匹配你想要的结构。

运行这段代码后,b变量就会生成你期望的嵌套二级哈希数组结构。

内容的提问来源于stack exchange,提问作者Ger Cas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:39:26