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

如何将Ruby嵌套哈希导出为指定列对齐格式的CSV文件

调整Ruby嵌套哈希导出CSV的格式实现

场景说明

用户拥有如下嵌套Ruby哈希,需将其中的节点坐标均值、链接最小直径、泵最小流量等数据导出为CSV,要求列对应哈希的键(0001、0002、0003):

{
    "0001" => {
        "All nodes" => [N001, N002, N003],
        "All links" => [N001.1, N002.1, N003.1],
        "Pumps" => [N001.2]
    },
    "0002" => {
        "All nodes" => [N004, N005, N006],
        "All links" => [N004.1, N005.1, N006.1],
        "Pumps" => [N005.2]
    },
    "0003" => {
        "All nodes" => [N007, N008, N009],
        "All links" => [N007.1, N008.1, N009.1],
        "Pumps" => [N007.2]
    }
}

哈希各层级数据定义:

  • All nodes:存储节点坐标信息
  • All links:存储invert、直径和存储量
  • Pumps:存储启停水位和流量

修改后的代码

require 'csv'

net = WSApplication.current_network
CSVsaveloc = WSApplication.file_dialog(false, "csv", "Comma Separated Variable File", "testexportcsv", false, true)

# 替换为你的实际哈希变量,注意不要用Ruby内置类名Hash作为变量名
network_data = {
    "0001" => {
        "All nodes" => [N001, N002, N003],
        "All links" => [N001.1, N002.1, N003.1],
        "Pumps" => [N001.2]
    },
    "0002" => {
        "All nodes" => [N004, N005, N006],
        "All links" => [N004.1, N005.1, N006.1],
        "Pumps" => [N005.2]
    },
    "0003" => {
        "All nodes" => [N007, N008, N009],
        "All links" => [N007.1, N008.1, N009.1],
        "Pumps" => [N007.2]
    }
}

CSV.open(CSVsaveloc, "wb") do |csv|
    # 写入表头:哈希的键作为列名
    csv << network_data.keys
    
    # 收集所有网络的节点x坐标平均值,组成一行写入
    x_means = network_data.values.map do |data|
        nodes_x = data["All nodes"].map(&:x)
        nodes_x.sum / nodes_x.size.to_f
    end
    csv << x_means
    
    # 收集所有网络的节点y坐标平均值,组成一行写入
    y_means = network_data.values.map do |data|
        nodes_y = data["All nodes"].map(&:y)
        nodes_y.sum / nodes_y.size.to_f
    end
    csv << y_means
    
    # 收集所有网络的链接最小直径,组成一行写入
    min_diameters = network_data.values.map do |data|
        data["All links"].map(&:diameter).min
    end
    csv << min_diameters
    
    # 收集所有网络的泵最小流量,组成一行写入
    min_discharges = network_data.values.map do |data|
        data["Pumps"].map(&:discharge).min
    end
    csv << min_discharges
end

关键改动说明

  1. 变量名修正:原代码误用Ruby内置类Hash作为变量名,改为自定义变量network_data避免冲突
  2. 数据收集逻辑调整:从逐个写入单值,改为按指标分组收集所有网络的对应数据,再整行写入CSV,保证每行对应一个指标,列对应不同网络
  3. 补充属性获取逻辑:明确了从节点、链接、泵对象中获取对应属性的方式(若实际属性名与示例不同,需自行替换)
  4. 移除冗余操作:删除了多余的File.new调用,CSV.open会自动处理文件的创建与写入

导出效果

执行代码后,导出的CSV格式将符合预期:

0001,0002,0003
246164.2646,246181.6492,246171.5763
518466.7589,518444.1727,518509.8948
300mm,250mm,500mm
0.01,0.005,0.1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:10:36