【问题标题】:Update value in key value pair in yml file using ruby [closed]使用 ruby​​ 更新 yml 文件中键值对中的值 [关闭]
【发布时间】:2023-03-03 20:01:01
【问题描述】:

我有一个 YAML 文件:

DATA_SVC_GEN_CONF_ATTR:
   -
     -   
       - 
         name: validationCodeNum
         value: 1
       - 
         name: validationCodeSymbol
         value: "val1"
       - 
         name: sql
         value: Test
       - 
         name: sqlByGridArea
         value: Test1

我想将键 sql 的值从“Test”替换为“Select * from table”。

我正在尝试的是:

asset.getAttributes.getList.each{|a|

  if a.getName == "sqlByGridArea"
     a.setValue "Select * from table"

    (attrib_defs).map!{|a| a.map{|k,v| "#{k}=#{v}"}.join(',')}
  end
   asset.with_attributes attrib_defs

【问题讨论】:

  • 您发布的 YAML 无效。可能是粘贴的时候搞错了?请编辑您的问题,以确保显示的代码与您使用的代码完全相同,包括缩进。
  • 我希望 yml 现在是正确的。
  • 不要“希望” YAML 是正确的,测试它。网上有 YAML 验证器,或者干脆使用 YAML 类来生成你想要的文件。
  • 您的示例代码对我们不可用。请阅读“minimal reproducible example”和 Jon Skeet 的 tinyurl.com/stack-hints

标签: ruby yaml jruby


【解决方案1】:

以下是如何测试您的 YAML 是否有效,以及我如何生成 YAML 以在文件或其他地方使用:

require 'yaml'

str = <<EOT
DATA_SVC_GEN_CONF_ATTR:
   -
     -   
       - 
         name: validationCodeNum
         value: 1
       - 
         name: validationCodeSymbol
         value: "val1"
       - 
         name: sql
         value: Test
       - 
         name: sqlByGridArea
         value: Test1
EOT

data = YAML.load(str)
# => {"DATA_SVC_GEN_CONF_ATTR"=>
#      [[[{"name"=>"validationCodeNum", "value"=>1},
#         {"name"=>"validationCodeSymbol", "value"=>"val1"},
#         {"name"=>"sql", "value"=>"Test"},
#         {"name"=>"sqlByGridArea", "value"=>"Test1"}]]]}

如果 YAML 无法解析数据,它会抱怨。如果可以并且数据不是您所期望的,那么输出可以帮助您诊断问题。

当我想创建一个 YAML 文件,尤其是一个复杂的文件时,我从实际的数据结构开始,让 YAML 生成它的序列化版本:

data = {
  'DATA_SVC_GEN_CONF_ATTR' =>
  [
    [
      [
        {
          'name' => 'validationCodeNum',
          'value' => 1
        },
        {
          'name' => 'validationCodeSymbol',
          'value' => 'val1'
        },
        {
          'name' => 'sql',
          'value' => 'Test'
        },
        {
          'name' => 'sqlByGridArea',
          'value' => 'Test1'
        }
      ]
    ]
  ]
}
puts data.to_yaml
# >> ---
# >> DATA_SVC_GEN_CONF_ATTR:
# >> - - - name: validationCodeNum
# >>       value: 1
# >>     - name: validationCodeSymbol
# >>       value: val1
# >>     - name: sql
# >>       value: Test
# >>     - name: sqlByGridArea
# >>       value: Test1

继续...要更改 YAML 文件中的元素,您可以将文件视为文本,逐行读取,通过 slurping 读取,或者让 YAML 打开它并更改生成的对象,然后使用 YAML重写它。

如果您确定数据适合内存并且可以轻松找到要更改的部分,则可以使用 Slurping 文件。逐行阅读通常可以更轻松地找到特定文本,因为您处理的是单个行,而不是整个文件。

我认为使用 YAML 是最简单的,因为它可以减少写得不好的正则表达式做错事的变化。

data = <<EOT
---
DATA_SVC_GEN_CONF_ATTR:
- - - name: validationCodeNum
      value: 1
    - name: validationCodeSymbol
      value: val1
    - name: sql
      value: Test
    - name: sqlByGridArea
      value: Test1
EOT

假设data 是磁盘上YAML 文件的内容,它会被使用YAML.load_file 加载和解析。在这个例子中,我作为一个字符串加载,所以我必须使用load:

object = YAML.load(data)

现在对数据进行了解析,因此可以轻松地对其进行操作:

object['DATA_SVC_GEN_CONF_ATTR'].first.first[2]['name'] = "Select * from table"

那么就可以写回了:

puts object.to_yaml # => nil
# >> ---
# >> DATA_SVC_GEN_CONF_ATTR:
# >> - - - name: validationCodeNum
# >>       value: 1
# >>     - name: validationCodeSymbol
# >>       value: val1
# >>     - name: Select * from table
# >>       value: Test
# >>     - name: sqlByGridArea
# >>       value: Test1

如果这是一个关键任务(生产)文件,您需要执行适当的重命名、写入、删除步骤来保护数据以防出现错误,但这就是要点。

不过,您的数据结构非常有问题。您使用嵌套数组数组数组只是为了保存您的哈希,这不是很常见或容易理解。相反,它应该简化为单个数组:

data = <<EOT
---
DATA_SVC_GEN_CONF_ATTR:
 - name: validationCodeNum
   value: 1
 - name: validationCodeSymbol
   value: val1
 - name: sql
   value: Test
 - name: sqlByGridArea
   value: Test1
EOT

object = YAML.load(data)
# => {"DATA_SVC_GEN_CONF_ATTR"=>
#      [{"name"=>"validationCodeNum", "value"=>1},
#       {"name"=>"validationCodeSymbol", "value"=>"val1"},
#       {"name"=>"sql", "value"=>"Test"},
#       {"name"=>"sqlByGridArea", "value"=>"Test1"}]}
object['DATA_SVC_GEN_CONF_ATTR'][2]['name'] = "Select * from table"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 2012-12-06
    • 2022-01-23
    • 1970-01-01
    • 2013-10-11
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多