Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 逐行阅读时拆分文本_Ruby_File_Parsing_Split - Fatal编程技术网

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

其工作原理似乎是,如果字符串中有另一个=则拆分会失败,在这种情况下空格会工作吗,您需要指定文件中所有可能行的格式,以便提供通用答案。也许你需要更多的逻辑,而不是单独的“拆分”。你能澄清一下文件中可能有哪些行吗?这是可行的,但似乎如果字符串中有另一个=则拆分将失败,在这种情况下空格是否可行?好的,你需要指定文件中所有可能行的格式,以便提供一个通用的答案。也许你需要更多的逻辑,而不是单独的“拆分”。你能澄清一下文件中可能有哪些行吗?