逐行阅读时拆分文本

时间:2017-08-17 18:22:55

标签: 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

我想要做的是将值TheFirststep SecondstepFinalstep分配给不同的变量。如果我们使用split(),那就更好了。

2 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

#!/usr/bin/ruby
text =  '/tmp/data'
data = []
f = File.open(text , "r")
f.each_line { |line|
  data.push( line.split("=").last)
}
f.close

答案 1 :(得分:0)

你说你想,“将值,'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) do |line|
  var, value, * = line.chomp.split(/\s*=\s*/)
  instance_variable_set("@#{var.downcase}", value)
end

@abc
  #=> "Thefirststep"
@xyz
  #=> "Secondstep"
@abc_xyz
  #=> "Finalstep"

实例变量名称的约定(在"@"之后)是使用snake-case,这就是我降低它们的原因。

将值存储在哈希

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是第二个值,*丢弃剩余的元素(如果有的话)。