gpt4 book ai didi

arrays - 不同长度的数组到一个 CSV

转载 作者:行者123 更新时间:2023-12-05 01:03:44 26 4
gpt4 key购买 nike

如果您有多个不同长度的数组,如何将它们导出到 powershell 中的单个 csv?

Array1 = 1,2,3 
Array2 = Bob,smithy,Alex,Jeremy
Array3 = yes,no

输出 CSV

Number  Name  Valid ———————————————————  1      Bob    Yes  2      Smithy no  3      Alex       Jeremy

Basically each array would be in its own header column.

Tried lines like

Array1 | Select-Object Number | export-csv -Path C:\Path

这适用于奇异数组到奇异 csv 文件

但如果我尝试

Array1, Array2, Array3 | Select-Object Number, Name, Valid | export-csv -Path C:\Path

我只得到标题名称,列中没有值

最佳答案

一种方法是使用 for loop

$Array1 = 1, 2, 3
$Array2 = 'Joe Bloggs', 'John Doe', 'Jane Doe'
$Array3 = 'Yes', 'No'

$export = for($i = 0; $i -lt [Linq.Enumerable]::Max([int[]] ($Array1.Count, $Array2.Count, $Array3.Count)); $i++) {
[pscustomobject]@{
Number = $Array1[$i]
Name = $Array2[$i]
Valid = $Array3[$i]
}
}
$export | Export-Csv path\to\csv.csv -NoTypeInformation

另一个使用 function 的示例,除了涉及更多开销之外,逻辑大致相同,因为此函数可以处理来自管道的无限数量的数组。

function Join-Array {
[CmdletBinding()]
param(
[parameter(ValueFromPipeline, Mandatory)]
[object[]] $InputObject,

[parameter(Mandatory)]
[string[]] $Columns
)

begin {
$inputDict = [ordered]@{}
$index = 0
}
process {
try {
if($MyInvocation.ExpectingInput) {
return $inputDict.Add($Columns[$index++], $InputObject)

}
foreach($item in $InputObject) {
$inputDict.Add($Columns[$index++], $item)
}
}
catch {
if($_.Exception.InnerException -is [ArgumentNullException]) {
$PSCmdlet.ThrowTerminatingError(
[Management.Automation.ErrorRecord]::new(
[Exception] 'Different count between input arrays and Columns.',
'InputArrayLengthMismatch',
[Management.Automation.ErrorCategory]::InvalidOperation,
$InputObject
)
)
}
$PSCmdlet.ThrowTerminatingError($_)
}
}
end {
foreach($pair in $inputDict.GetEnumerator()) {
$count = $pair.Value.Count
if($count -gt $max) {
$max = $count
}
}
for($i = 0; $i -lt $max; $i++) {
$out = [ordered]@{}
foreach($column in $inputDict.PSBase.Keys) {
$out[$column] = $inputDict[$column][$i]
}
[pscustomobject] $out
}
}
}

使用很简单,数组可以通过pipeline传递:

$Array1 = 1, 2, 3
$Array2 = 'Joe Bloggs', 'John Doe', 'Jane Doe'
$Array3 = 'Yes', 'No'
$Array4 = 'hello', 'world', 123, 456

$Array1, $Array2, $Array3, $Array4 | Join-Array -Columns Number, Name, Valid, Test |
Export-Csv path\to\csv.csv -NoTypeInformation

或者通过 Named Parameter / Positional 绑定(bind):

Join-Array $Array1, $Array2, $Array3, $Array4 -Columns Number, Name, Valid, Test | 
Export-Csv path\to\csv.csv -NoTypeInformation

关于arrays - 不同长度的数组到一个 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73640310/

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