Powershell中嵌套Hashtable导出为指定格式CSV的问题
解决Powershell嵌套Hashtable导出CSV格式异常问题
错误原因
- 第一种导出写法中
Port属性的表达式直接返回DictionaryEntry枚举集合,CSV序列化时仅会输出类型名而非实际端口值 - 第二种导出写法将IP作为PSObject的属性名,导出CSV时属性会转为表头,因此出现IP横向排列的问题
- 未显式指定
-NoTypeInformation参数时,Export-Csv会默认在头部输出类型标识行
修复后的完整代码
$filepath = "ip.csv" $host_list = Import-Csv $filepath $hash = @{} $host_list | ForEach-Object{ $IP = $_.IP $Port = $_.Port if(-not $hash.ContainsKey($IP)){ $hash[$IP] = @{} } if(-not $hash[$IP].ContainsKey($Port)){ $hash[$IP][$Port] = @{} } } # 构造导出的行集合 $exportRows = @() $hash.GetEnumerator() | Sort-Object Name | ForEach-Object { $currentIP = $_.Key $portList = $_.Value.Keys | Sort-Object { [int]$_ } # 按端口数值排序 $isFirstRow = $true foreach ($port in $portList) { $exportRows += [PSCustomObject]@{ IP = if ($isFirstRow) { $currentIP } else { '' } Ports = $port } $isFirstRow = $false } } # 导出CSV # PowerShell 5.1 可把Encoding改为 Default 适配Excel打开乱码问题 $exportRows | Export-Csv -Path "IPList.csv" -NoTypeInformation -Encoding UTF8
补充说明
CSV是纯文本格式,本身不存储对齐规则,你需要的IP左对齐、Ports居中效果,可以在Excel、WPS等表格工具打开文件后,手动设置列对齐属性即可。
内容的提问来源于stack exchange,提问作者Robert Smith
相关产品推荐
相关产品推荐

