【问题标题】:Trim Values inside (one array inside (twoDimentionalArray))修剪里面的值(一个数组里面(twoDimentionalArray))
【发布时间】:2016-04-21 18:41:15
【问题描述】:

我正在尝试删除二维数组中数组的所有值中的前导 0。

有没有图书馆可以为我做到这一点?我尝试了一个 foreach 循环,但它只修剪当前的临时变量。

代码如下:

[String[]]$arr1 = @('str1','str2','str3')
[String[]]$arr2 = @('str4','str5','str6')
[String[]]$arr3 = @('0str7')

[System.Object[]]$twoDimensionalArray = @()
[System.Object[]]$twoDimensionalArray += ,($arr1)
[System.Object[]]$twoDimensionalArray += ,($arr2)
[System.Object[]]$twoDimensionalArray += ,($arr3)

Write-Host "Removing leading zeros from array in twoDimentionalArray..."
ForEach ($strValue in $twoDimensionalArray[2])
{
    $strValue = $strValue.TrimStart('0')
}
Write-Host "Leading zero's are removed."
Write-Host ""

Write-Host '$strValue =' $strValue
Write-Host '$twoDimensionalArray[2] =' $twoDimensionalArray[2]
Write-Host ""

输出 (0str7)

Removing leading zeros from array in twoDimentionalArray...
Leading zero's are removed.

$strValue = str7
$twoDimensionalArray[2] = 0str7

所需的输出 (str7)

Removing leading zeros from array in twoDimentionalArray...
Leading zero's are removed.

$strValue = str7
$twoDimensionalArray[2] = str7

有什么想法吗?

【问题讨论】:

标签: powershell powershell-3.0


【解决方案1】:

这是带有所需输出的修改后的代码 sn-p。诀窍是修改对象本身:

    [String[]]$arr1 = @('str1','str2','str3')
    [String[]]$arr2 = @('str4','str5','str6')
    [String[]]$arr3 = @('0str7')

    [System.Object[]]$twoDimensionalArray = @()
    [System.Object[]]$twoDimensionalArray += ,($arr1)
    [System.Object[]]$twoDimensionalArray += ,($arr2)
    [System.Object[]]$twoDimensionalArray += ,($arr3)

    Write-Host "Removing leading zeros from array in twoDimentionalArray..."
    [int] $arrayCounter = 0
    ForEach ($strValue in $twoDimensionalArray[2])
    {
        $twoDimensionalArray[2][$arrayCounter] = $strValue.TrimStart('0')

        $arrayCounter++
    }
    Write-Host "Leading zero's are removed."
    Write-Host ""

    Write-Host '$strValue =' $strValue
    Write-Host '$twoDimensionalArray[2] =' $twoDimensionalArray[2]
    Write-Host ""

我已经对此进行了测试,它会按照您的预期输出 str7。

【讨论】:

    【解决方案2】:

    编辑所有锯齿状数组

    这可能被认为是作弊,我不知道你 实际 用例是否会遵守这一点,但我试图通过在这个 jagged 上使用数组运算符来简化它 数组。

    $twoDimensionalArray = $twoDimensionalArray | Foreach-object{
        ,($_ -replace "^0+")
    }
    

    这应该保存回原始数组$twoDimensionalArray。使用-replace 可以节省我们运行一个单独的循环以进入另一个数组。

    这将使用正则表达式替换数组元素中的所有前导零。由于数组随后会展开,我们仍然需要一元运算符来确保数据作为数组沿管道发送。

    根据您对输入的控制,这可以简化为

    $arr1 = @('str1','str2','str3')
    $arr2 = @('str4','str5','str6')
    $arr3 = @('0str7')
    
    [string[]]$twoDimensionalArray = $arr1, $arr2, $arr3 | ForEach-Object{
        ,($_ -replace "^0+")
    } 
    

    只编辑锯齿状数组的一个元素

    使用上述逻辑进行非常简单的更改即可使其运行。

    $elementToChange = 2
    $twoDimensionalArray[$elementToChange] = [String[]]@($twoDimensionalArray[$elementToChange] -replace "^0+")
    

    【讨论】:

    • 即使你没有明确提及,-replace 也会解析循环中的所有元素,这本质上具有相同的性能。在我看来,这取决于是否使用 -replace 与循环的要求。如果您想要更多控制并执行更多操作,那么循环更有意义。
    • @AmanSharma 我认为我很明确 _ 我试图通过在这个锯齿状数组上使用 数组运算符 来使它更容易一些_。如果您想执行更多操作,您可以链接更多 -replaces 或使用更强大的正则表达式。我明白你的意思。
    • 我只想从第三个数组中去掉 0(不是二维数组中的所有数组),但还是谢谢。
    • @FiddleFreak 我的错。我已经更新了我的答案,现在它实际上回答了你的问题。
    • 嗨@Matt,,($_ -replace "^0+") 中逗号的用途是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2017-06-14
    • 2015-03-15
    • 2011-06-12
    • 1970-01-01
    • 2021-05-03
    相关资源
    最近更新 更多