Ruby 逐行阅读时拆分文本
我正在尝试读取一个包含如下内容的文本文件Ruby 逐行阅读时拆分文本,ruby,file,parsing,split,Ruby,File,Parsing,Split,我正在尝试读取一个包含如下内容的文本文件 ABC = Thefirststep XYZ = Secondstep ABC_XYZ = Finalstep=345ijk!r4+ 我可以用这个工具逐行读取文件 #!/usr/bin/ruby text = '/tmp/data' f = File.open(text , "r") f.each_line { |line| puts line } f.close 我要做的是将值第一步第二步和最后一步分配给单独的变量。如果我们使用split()
ABC = Thefirststep
XYZ = Secondstep
ABC_XYZ = Finalstep=345ijk!r4+
我可以用这个工具逐行读取文件
#!/usr/bin/ruby
text = '/tmp/data'
f = File.open(text , "r")
f.each_line { |line|
puts line
}
f.close
我要做的是将值
第一步
第二步
和最后一步
分配给单独的变量。如果我们使用split()更好。您可以使用如下内容:
#!/usr/bin/ruby
text = '/tmp/data'
data = []
f = File.open(text , "r")
f.each_line { |line|
data.push( line.split("=").last)
}
f.close
您可以使用以下内容:
#!/usr/bin/ruby
text = '/tmp/data'
data = []
f = File.open(text , "r")
f.each_line { |line|
data.push( line.split("=").last)
}
f.close
您说过要“将值、'TheFirststep'、'Secondstep'和'Finalstep'分配给单独的变量
您不能动态地创建局部变量(至少从Ruby v1.8开始就不能),这就留下了两种选择:将这些值分配给实例变量,或者使用不同的数据结构,特别是散列
首先,让我们创建一个数据文件
data <=-END
ABC = Thefirststep
XYZ = Secondstep
ABC_XYZ = Finalstep=345ijk!r4+
END
FName = 'test'
File.write(FName, data)
#=> 73
实例变量名称的约定(在“@”
之后)是使用,这就是为什么我对它们进行了小写
将值存储在散列中
File.foreach(FName).with_object({}) do |line,h|
var, value, * = line.chomp.split(/\s*=\s*/)
h[var] = value
end
#=> {"ABC"=>"Thefirststep", "XYZ"=>"Secondstep", "ABC_XYZ"=>"Finalstep"}
虽然这很容易做到,但动态生成实例变量或使用动态创建的键生成散列通常没有帮助。这是因为它们只有在可以获取并可能更改其值时才有用,这是有问题的
注意,在
var, value, * = line.chomp.split(/\s*=\s*/)
var
等于拆分操作返回的数组的第一个元素,value
是第二个值,*
丢弃剩余的元素(如果有)。您说过要“将值、'FirstStep'、'Secondstep'和'Finalstep'分配给单独的变量
您不能动态地创建局部变量(至少从Ruby v1.8开始)。剩下两种选择:将这些值分配给实例变量,或者使用不同的数据结构,特别是散列
首先,让我们创建一个数据文件
data <=-END
ABC = Thefirststep
XYZ = Secondstep
ABC_XYZ = Finalstep=345ijk!r4+
END
FName = 'test'
File.write(FName, data)
#=> 73
实例变量名称的约定(在“@”
之后)是使用,这就是为什么我对它们进行了小写
将值存储在散列中
File.foreach(FName).with_object({}) do |line,h|
var, value, * = line.chomp.split(/\s*=\s*/)
h[var] = value
end
#=> {"ABC"=>"Thefirststep", "XYZ"=>"Secondstep", "ABC_XYZ"=>"Finalstep"}
虽然这很容易做到,但动态生成实例变量或使用动态创建的键生成散列通常没有帮助。这是因为它们只有在其值可以获得并可能更改时才有用,这是有问题的
注意,在
var, value, * = line.chomp.split(/\s*=\s*/)
var
等于拆分操作返回的数组的第一个元素,value
是第二个值,*
丢弃剩余的元素(如果有的话)。其工作原理似乎是,如果字符串中有另一个=则拆分会失败,在这种情况下空格会工作吗,您需要指定文件中所有可能行的格式,以便提供通用答案。也许你需要更多的逻辑,而不是单独的“拆分”。你能澄清一下文件中可能有哪些行吗?这是可行的,但似乎如果字符串中有另一个=则拆分将失败,在这种情况下空格是否可行?好的,你需要指定文件中所有可能行的格式,以便提供一个通用的答案。也许你需要更多的逻辑,而不是单独的“拆分”。你能澄清一下文件中可能有哪些行吗?