Ruby on Rails 5.2数组单元格计算及Excel导入层级格式化问题
两个Ruby/Rails问题的解决方案
问题1:如何在Ruby on Rails 5.2中计算数组中某一行的每个单元格?
咱们先明确场景——你说的应该是处理二维数组里某一行的每个元素吧?比如求和、转换数值或者自定义运算?这里给你几个实用的示例:
假设你有这样的二维数组(可能是从数据库、Excel读取的行数据):
data = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
- 取出某一行并转换每个元素
比如取第二行(索引为1),把每个元素乘以2:
target_row = data[1] # 得到 [4, 5, 6] processed_row = target_row.map { |cell| cell * 2 } # 结果是 [8, 10, 12]
map方法会遍历每个元素,返回处理后的新数组,非常适合批量转换。
- 计算某一行的总和
如果是要统计整行的数值和,直接用sum方法就行(Rails 5.2完全支持):
row_total = data[1].sum # 结果是 15(4+5+6) # 也可以用传统的inject写法: row_total = data[1].inject(0, :+)
- 自定义复杂逻辑处理每个单元格
比如根据单元格数值返回对应状态:
status_list = data[1].map do |cell| if cell > 5 '大于5' elsif cell == 5 '等于5' else '小于5' end end # 结果是 ["小于5", "等于5", "大于5"]
如果只是要遍历执行操作(不需要返回新数组),才用each,但如果需要处理后的结果,map或sum更合适。
问题2:Excel导入时层级格式转换问题
你的代码之所以返回原数组["10", "1", "1", "4"],是因为each方法本身就会返回调用它的原数组,而不是你拼接出来的字符串。要生成累积的目标字符串,咱们换两种更靠谱的写法:
写法1:先处理所有部分再拼接(更清晰)
# 先取出原始层级字符串 original_hierarchy = spreadsheet.cell(i, 2) # 分割后每个部分补前导零到3位 formatted_parts = original_hierarchy.split('.').map { |part| part.rjust(3, '0') } # 拼接成最终格式 record.hierarchy = "1.#{formatted_parts.join('.')}"
这里用rjust(3, '0')是Ruby字符串的原生方法,能把字符串右对齐,不足3位的话左边补0,完美满足你的格式需求。测试一下:输入"10.1.1.4"会得到"1.010.001.001.004",完全符合预期。
写法2:用inject累积生成字符串
如果你想一步完成,也可以用inject(和reduce是别名)来逐步构建结果:
record.hierarchy = spreadsheet.cell(i, 2).split('.').inject('1.') do |result, part| result + "#{part.rjust(3, '0')}." end.chop # 去掉最后多余的一个点
inject从初始值'1.'开始,每次把处理后的部分拼接到结果里,最后用chop去掉末尾多出来的.就行。
另外提一句:你原来代码里的index = index || '1.'存在隐患——如果循环多次,index已经有值的话,初始值'1.'不会再生效,用上面两种写法就不会有这个问题啦。
内容的提问来源于stack exchange,提问作者user1185081
相关产品推荐
相关产品推荐

