Ruby脚本逐行读取文件并使用puts执行if语句?
Posted
技术标签:
【中文标题】Ruby脚本逐行读取文件并使用puts执行if语句?【英文标题】:Ruby script to read file line by line and do if statments with puts? 【发布时间】:2014-08-21 17:33:16 【问题描述】:我正在尝试编写一个脚本,该脚本将通过在文本文件上使用if
语句来填写设备映射。
这是我尝试过的代码:
输入.txt:
SWITCH
ROUTER
FIREWALL
ROUTER
ROUTER
FIREWALL
SWITCH
SWITCH
Ruby 代码:
IO.foreach("input.txt") do |type_equipment|
if type_equipment = "SWITCH"
puts "SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch"
elsif type_equipment = "ROUTER"
puts "ROUTER,BMC_COMPUTERSYSTEM,Network,Router,Ethernet Router"
elsif type_equipment = "FIREWALL"
puts "FIREWALL,BMC_COMPUTERSYSTEM,Network,Appliance,Firewall"
end
end
代码运行但输出如下:
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
main.rb:6: warning: found = in conditional, should be ==
main.rb:4: warning: found = in conditional, should be ==
main.rb:2: warning: found = in conditional, should be ==
我希望它评估文件中的每一行,如果它匹配 if
语句,则输出关联的 puts
。
我还为if
语句绑定了==
,但它只显示第一行的结果,没有警告。
【问题讨论】:
【参考方案1】: 请正确缩进代码 如错误消息所示,您必须使用==
而不是=
进行比较(=
是变量赋值)
type_equipment
末尾有一个换行符,您可以使用String#chomp
删除它
条件将最后一个表达式作为返回值,因此您可以在 if
前面写一个 puts
,而不是在块内重复它
我建议使用case
而不是重复的if
语句
这些建议将导致:
IO.foreach("input.txt") do |type_equipment|
puts case type_equipment.chomp
when "SWITCH" then "SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch"
when "ROUTER" then "ROUTER,BMC_COMPUTERSYSTEM,Network,Router,Ethernet Router"
when "FIREWALL" then "FIREWALL,BMC_COMPUTERSYSTEM,Network,Appliance,Firewall"
end
end
【讨论】:
【参考方案2】:main.rb:6: warning: found = in conditional, should be ==
答案就在你面前。
比较两个东西时,你使用var1==var2
。
var1=var2
是一个赋值运算符,它设置var1
的值等于var2
的值,所以你的代码应该是:
IO.foreach("input.txt") do |type_equipment|
if type_equipment == "SWITCH"
puts "SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch"
elsif type_equipment == "ROUTER"
puts "ROUTER,BMC_COMPUTERSYSTEM,Network,Router,Ethernet Router"
elsif type_equipment == "FIREWALL"
puts "FIREWALL,BMC_COMPUTERSYSTEM,Network,Appliance,Firewall"
end
end
【讨论】:
不,这只会输出 1 个结果:SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch 我不确定,但我通常会像这样遍历 ruby 中的文件:alvinalexander.com/blog/post/ruby/… 我认为它不起作用,因为type_equipment
末尾有一个换行符。
你可以做 type_equipment.delete("\n")==var then
“我认为它不起作用,因为 type_equipment 末尾有一个换行符”。当从文件中读取记录时,foreach
去除尾随的换行符。【参考方案3】:
为了在添加新设备或停用现有设备时更容易维护您的代码,请考虑使用哈希:
hash = "SWITCH" => "SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch",
"ROUTER" => "ROUTER,BMC_COMPUTERSYSTEM,Network,Router,Ethernet Router",
"FIREWALL" => "FIREWALL,BMC_COMPUTERSYSTEM,Network,Appliance,Firewall"
equipment =
"SWITCH
ROUTER
FIREWALL
ROUTER
PINGER
ROUTER
FIREWALL
SWITCH
SWITCH"
equipment.each_line do |l|
equip = l.strip
puts hash[equip] if hash.key?(equip)
end
# SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
# ROUTER,BMC_COMPUTERSYSTEM,Network,Router,Ethernet Router
# ...
# SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
或者,如果您愿意:
equipment.each_line do |l|
equip = l.strip
puts (hash.key?(equip) ? hash[equip] : "***What the heck is a '#equip'??")
end
# SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
# ...
# ROUTER,BMC_COMPUTERSYSTEM,Network,Router,Ethernet Router
# ***What the heck is a 'PINGER'??
# ROUTER,BMC_COMPUTERSYSTEM,Network,Router,Ethernet Router
# ...
# SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
您可以使用String#chomp
而不是String#strip
,但我选择了后者,因为它会删除前后的所有空格以及换行符。从文件中读取时,您需要使用枚举器IO#foreach。
【讨论】:
以上是关于Ruby脚本逐行读取文件并使用puts执行if语句?的主要内容,如果未能解决你的问题,请参考以下文章