gpt4 book ai didi

powershell - 将行转为列的更好替代方案

转载 作者:行者123 更新时间:2023-12-02 05:59:53 33 4
gpt4 key购买 nike

尝试在 powershell 中堆叠这些列,它成功了!然而,感觉应该有一种更简单的方法来做到这一点。如果您有可以实现相同目标的替代方案,请告诉我

$lines = @'
5
b d7 e
c f
'@

$lines = $lines.Split("`n")

$max = $lines | % {$_.trim().split(' ').count} | sort -desc | select -f 1
$count = 0
$obj = New-Object psobject
foreach ($line in $lines) {
$obj | Add-Member -MemberType NoteProperty -Name $count -Value $line
$count++
}

for ($x = 0; $x -lt $count; $x++) {
for ($y = 0; $y -lt $count; $y++) {
$obj.$y.trim().split(' ')[$x]
}
}

期望的输出是这样的:

5
b
c
d7
f
e

这是输入和所需输出的更随机的示例。脚本:

$alpha = 65..90 | % { [char]$_ }
$lines = for ($i = 0; $i -lt $alpha.Count; $i ++) {
$line = ''
$cols = Get-Random -Minimum 1 -Maximum 6
for ($j = 0; $j -lt $cols; $j++) {
$line += $alpha[$i+$j] + ' '
}
$line.Trim()
$i = $i + $cols - 1
}

$lines = $lines.Split("`n")

$lines
# Rest of code same as above.

第一部分显示数组。第二部分显示了我想要的样子。 (提醒:脚本已经可以运行,只是寻找替代方案)

A
B C D E
F G
H I
J
K L M N
O
P Q R S
T U V W
X Y Z

A
B
F
H
J
K
O
P
T
X
C
G
I
L
Q
U
Y
D
M
R
V
Z
E
N
S
W

最佳答案

给定 $lines 是您上面的字符串之一,这样的东西就可以正常工作。来自文件的文本也可以很容易地插入到此处。

$linesArray = $lines -split "`r`n" | ForEach-Object{,($_.Trim() -split '\s')}
$columns = ($linesArray | Measure-Object Count -Maximum).Maximum

$result = for($index =0; $index -lt $columns;$index++){
$linesArray | Where-Object {$index -lt $_.Length} | ForEach-Object{$_[$index]} | Where-Object{![string]::IsNullOrEmpty($_)}
}

其中$result包含“转置”数组。将 $lines 拆分为行,并为每行拆分空格(在我在示例中发现的尾随空格的情况下使用 Trim()ed)。

计算最大列数,以便我们知道循环的结构。然后只需按顺序调用每行的第 n 个元素即可。空值将被忽略,因此调用不存在的元素不是问题。

使用 PowerShell v4 进行测试,但如果需要,可以轻松降级。 $columns 是唯一需要更改的内容。

<小时/>

我做了一些更改来处理评论。如果启用了严格模式来标记访问不存在的元素,则简单的 where 子句将阻止访问那些不存在的元素。解决后处理问题时返回的空值也是正确的。

关于powershell - 将行转为列的更好替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34624316/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com