【问题标题】:Powershell - split string to array delineated by start and end stringsPowershell - 将字符串拆分为由开始和结束字符串描述的数组
【发布时间】:2020-10-22 02:14:57
【问题描述】:

我有一个多行字符串(来自 json),例如

"somekey": "somevalue",
"somekey": "somevalue"
"somekey": [somevalue]
"somekey": somenumber
"somekey": null,

我想将字符串拆分为一个数组,其中每个元素的值要么是 somevalue 的值,要么是 somenumber。 (我实际上是在形成一个数组,其中包含出现在 json 中的每个值的值)

这应该产生以下元素值:

somevalue
somevalue
somevalue
somenumber

我玩过以下代码的变体和添加:

$jsonValues = $jsonValues.Split(": ").Split([Environment]::NewLine)

但想知道实现这一目标的最有说服力的方法。

【问题讨论】:

  • 是一个多行字符串还是一个字符串数组?
  • 假设你有一个多行字符串,并且它存储在$InStuff,这个工作...... >>> $InStuff.Split(':').Trim().Trim('",][').Where({$_})
  • 谢谢李,我应该补充一点,实际上字符串是多行的,每一行都包含一些键。我所需要的只是将值收集到一个数组中,然后描述过去的键。我已经更新了问题以反映。您的代码有效,但也给了我作为数组值项的键
  • 不客气! [grin] ///// .Split() 方法不会在括号中的字符串上拆分...它会在该字符串中的每个字符上拆分。这是另一个尝试... >>> ($InStuff -split [System.Environment]::NewLine).ForEach({$_.Split(':')[-1]}).Trim(' ",][')
  • @mklement0 这个想法最初是获取一个 json,并尝试从中获取每个值,无论它在哪里,并将其放入任意值的数组中。必须先对原始数据进行一些切片。虽然可能有一种更优化的方式从 json 中获取每个值,通过原始字符串搜索、拆分、修剪等。

标签: arrays string powershell split


【解决方案1】:

这是一个从 JSON 文档中提取所有叶属性值的函数,通过ConvertFrom-Json 使用正确的 JSON 解析:

# Accepts a JSON string and outputs all leaf property values.
function Get-JsonValue {
  param([Parameter(ValueFromPipeline)] $json)

  begin {
    # Helper function that walks the object graph.
    function walk {
      param($obj)

      # Note: @(...) is used so that scalar $null values aren't ignored.
      foreach ($elem in @($obj)) {
        if ($elem -isnot [System.Management.Automation.PSCustomObject]) { 
          $elem # leaf value -> output
        }
        else {
          # recurse
          foreach ($prop in $elem.psobject.Properties) {
            foreach ($subElem in @($prop.Value)) { walk $subElem }
          }
        }
      }
    }
  }

  process {
    walk ($json | ConvertFrom-Json)
  }

}

# Sample JSON input
$json = @'
  [ { "hi": 11 }, {
    "somekey1": "somevalue1",
    "somekey2": "somevalue2",
    "somekey3": 42,
    "somekey4": [
        "somevalue4.1",
        "somevalue4.2",
        4.42
      ],
    "somekey5": null
  } ]
'@


# Call with the sample string
$json | Get-JsonValue

以上结果如下:

11
somevalue1
somevalue2
42
somevalue4.1
somevalue4.2
4.42
# $null - not visible

【讨论】:

    【解决方案2】:

    感谢 Lee_Dailey - 他的过滤器在将所有值从原始 json 抓取到数组时为我产生了最多的结果。

    ($InStuff -split [System.Environment]::NewLine).ForEach({$_.Split(':')[-1]}).Trim(' ",][')
    

    【讨论】:

      猜你喜欢
      • 2020-10-19
      • 2018-11-14
      • 1970-01-01
      • 2012-02-22
      • 2017-06-27
      • 1970-01-01
      相关资源
      最近更新 更多