【问题标题】:Split array into multiple array performance将阵列拆分为多个阵列性能
【发布时间】:2019-11-24 09:02:56
【问题描述】:

我尝试使用 PowerShell 将以下数组拆分为多个较小的数组。但是逐行输出文本文件需要很多时间。还有其他方法可以提高性能吗?

原始数组($FRUITARRAY):

橙色,1,4,5,6,7,8 苹果,1,3,2,4,5 橙色,2,4,5,6,7,8 橙色,3,4,5,6,7,8 苹果,2,3,2,4,5 橙色,4,4,5,6,7,8 橙色,5,4,5,6,7,8 苹果,3,3,2,4,5 苹果,4,3,2,4,5

所需的输出数组:

$ORANGERRAY:

橙色,1,4,5,6,7,8 橙色,2,4,5,6,7,8 橙色,3,4,5,6,7,8 橙色,4,4,5,6,7,8 橙色,5,4,5,6,7,8

$APPLEARRAY:

苹果,1,3,2,4,5 苹果,2,3,2,4,5 苹果,3,3,2,4,5 苹果,4,3,2,4,5

代码:

$FRUITARRAY = Get-Content 'D:\work\fruit.txt'

for ($i=1; $i -lt $FRUITARRAY.Length; $i++) {
    if ($FRUITARRAY[$i].Split(',')[0].StartsWith('ORANGE')) {
        $FRUITARRAY[$i] | Out-File "D:\work\ORANGE.TXT" -Append
    }

    if ($FRUITARRAY[$i].Split(',')[0].StartsWith('APPLE')) {
        $FRUITARRAY[$i] | Out-File "D:\work\APPLE.TXT" -Append
    }
}

$ORANGEARRAY = Get-Content "D:\work\ORANGE.TXT"
$APPLEARRAY  = Get-Content "D:\work\APPLE.TXT"

【问题讨论】:

  • 我试图重新格式化你的代码,但它太坏了,无法挽救(它不是有效的 powershell)。请使用当前运行缓慢的实际代码更新帖子
  • 编辑了实际代码。文本文件中可能有 500k 行。谢谢...
  • 如果您不需要这些文件(ORANGE.TXTAPPLE.TXT),我强烈建议您将所有内容保存在内存中。您可以通过首先分配一个空数组来连接一个数组:`$ORANGEARRAY = @()`,然后添加新值,例如:if ($FRUITARRAY[$i].StartsWith('ORANGE')) {$ORANGEARRAY += $FRUITARRAY[$i]}。 (顺便说一句,如果你使用.StartsWith,那么吐出来是没有用的)

标签: arrays powershell split


【解决方案1】:

可以说最优雅的解决方案是Group-Object:

$fruits = Get-Content 'D:\work\fruit.txt' | Group-Object { $_.Split(',')[0] }

$apples  = $fruits |
           Where-Object { $_.Name -eq 'apple' } |
           Select-Object -Expand Group
$oranges = $fruits |
           Where-Object { $_.Name -eq 'orange' } |
           Select-Object -Expand Group

【讨论】:

  • 为什么不用组名来命名变量呢? foreach($fruit in $fruits){Set-Variable -Name "$($fruit.Name)Array" -Value ($fruit.Group)} 提供的实际名称作为变量名是有效的。
  • @LotPings 我认为动态命名变量是一种不好的做法,所以我不建议这样做。如果有的话,把这些组放在一个哈希表中。
猜你喜欢
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
相关资源
最近更新 更多