【问题标题】:Split text while reading line by line逐行阅读时拆分文本
【发布时间】:2017-08-17 18:22:55
【问题描述】:

我正在尝试读取包含这样内容的文本文件

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() 会更好。

【问题讨论】:

    标签: ruby file parsing split


    【解决方案1】:

    你可以这样使用:

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

    【讨论】:

    • 它可以工作,但似乎如果字符串中有另一个 = 则拆分会失败,在这种情况下空间会起作用吗?
    • 嗯,您需要指定文件中所有可能行的格式,以便提供通用答案。可能您需要比单独的“拆分”更多的逻辑。您能否阐明文件中可能包含的行?
    【解决方案2】:

    您说过您希望“将值 '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 是第二个值,* 丢弃剩余元素(如果有)。

    【讨论】:

      猜你喜欢
      • 2023-02-10
      • 2019-05-14
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 2016-10-07
      • 2015-03-31
      相关资源
      最近更新 更多