如何将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
关键改动说明
- 变量名修正:原代码误用Ruby内置类
Hash作为变量名,改为自定义变量network_data避免冲突 - 数据收集逻辑调整:从逐个写入单值,改为按指标分组收集所有网络的对应数据,再整行写入CSV,保证每行对应一个指标,列对应不同网络
- 补充属性获取逻辑:明确了从节点、链接、泵对象中获取对应属性的方式(若实际属性名与示例不同,需自行替换)
- 移除冗余操作:删除了多余的
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
相关产品推荐
相关产品推荐

