将数据导出到CSV列

时间:2018-10-16 19:29:09

标签: powershell

我有2个数组-$ Hostnames和$ Ipaddresses。

我的$ Hostname数组显示计算机主机名列表,而我的$ Ipaddresses数组显示与$ Hostnames数组相对应的ipaddresss列表。

我有一个带2个标头的现有CSV文件-“主机名”和“ Ipaddress”

我希望将2个数组导出到具有2列的CSV文件中。一列包含主机名,另一列包含Ipaddresses。

在本网站和我访问过的其他网站上,对类似问题有多个答案,但是到目前为止,它们都没有帮助我。

这是我得到的最接近的东西...

$CSV = Import-Csv -path C:\temp\scripts\ReimageCheck\results.csv

foreach ($column in $CSV) {

generate column 1 value.

    $column."Hostname" = $Hostnames

generate column 2 value.

    $column."Ipaddress" = $Ipaddresses

} 

$CSV | Export-Csv -Path C:\temp\scripts\ReimageCheck\Results2.csv

但是当我打开“ Results2.csv”时,所有信息都是一堆乱码,散布在各处。任何帮助将不胜感激。如果我们可以消除对预先存在的csv文件的需要,而仅使用两列信息创建一个新的csv文件,那就更好了。

2 个答案:

答案 0 :(得分:1)

假设您的两个数组的大小实际上相同...

您可以在for循环中对其进行迭代,然后将新的pscustomobject添加到数组中,然后将其另存为CSV。

$data = @()
$hostnames = @('h1','h2','h3')
$ipaddresses = @('1.1.1.1','2.2.2.2','3.3.3.3')

for ($i = 0; $i -lt $hostnames.Count; $i++)
{
    $data += [pscustomobject]@{'HostName'=$hostnames[$i]; 'IpAddress'=$ipaddresses[$i]}
}

# test
$data | ConvertTo-Csv -NoTypeInformation

#
#$data | Export-Csv -Path 'C:\temp\scripts\ReimageCheck\Results2.csv'

有几种方法可以提高此算法的速度等,但这以最直接的方式展示了一切。使用ISE或VSCode通过逐步调试和理解代码。另外,使用Get-Help搜索您不熟悉的其他内容。

答案 1 :(得分:0)

对于大型CSV文件,由于对于循环的每次迭代都会重新创建$ data数组,因此上述操作效率非常低。

一个更有效的解决方案是

$hostnames = @('h1','h2','h3')
$ipaddresses = @('1.1.1.1','2.2.2.2','3.3.3.3')

$data = for ($i = 0; $i -lt $hostnames.Count; $i++)
{
    [pscustomobject]@{'HostName'=$hostnames[$i]; 'IpAddress'=$ipaddresses[$i]}
}

# test
$data | ConvertTo-Csv -NoTypeInformation

#
#$data | Export-Csv -Path 'C:\temp\scripts\ReimageCheck\Results2.csv'