Powershell 将哈希表中的数组导出为CSV而不带空行

Powershell 将哈希表中的数组导出为CSV而不带空行,powershell,export-to-csv,Powershell,Export To Csv,我有一个哈希表,其中包含字符串数组作为值,例如 Name Value ---- ----- ID1 {SN1,IN1} ID2 {SN2,IN2} ID3 {SN3,IN3} ID4 {SN4,IN4} ...

我有一个哈希表,其中包含字符串数组作为值,例如

Name                      Value
----                      -----
ID1                       {SN1,IN1}
ID2                       {SN2,IN2}
ID3                       {SN3,IN3}
ID4                       {SN4,IN4}        
...                       ...
SN#
IN#
作为字符串

我想将此哈希表导出为以下格式的CSV文件:

 SN | IN
---------
SN1 | IN1
SN2 | IN2
SN3 | IN3
SN4 | IN4
。。。等等

所以我用

$ht.GetEnumerator() | ForEach-Object {
    New-Object -Type PSObject -Property @{
        'SN' = $_.Value[0]
        'IN' = $_.Value[1]
    }
} | Select-Object SN, IN | Export-Csv 'output.csv' -NoType
但是现在输出看起来像

 SN | IN
---------
SN1 | IN1
SN2 | 
    | 
SN3 | IN2
SN4 | IN3
。。。以此类推,使用空行

因此,当我尝试调试时,我在键入时打印出字典值

$ht.values.get(0) 
我得到

SN1
SN2

SN3
SN4 

给我

IN1
IN2


IN3
IN4
它将在值之间提供空白行。 但是我用一个计数器$n在一个常规的forloop中打印出值, 比如

我没有空行。 当我转换为Json时,我得到

{"ID1": [
             "SN1",
             "IN1\r\n"
        ],
{"ID2": [
             "SN2",
             "IN2\r\n"
        ],
{"ID3": [
             "SN3",
             "IN3\r\n"
        ],
{"ID4": [
             "SN4",
             "IN4\r\n"
        ]
}

如何在导出到csv文件时跳过这些空行?

我已尝试复制您看到的错误,但没有得到相同的结果。 我怀疑这可能与您的阵列有关,但很难知道,因为我看不到您的数据源

这是我的测试复制:

#Array made our of string pairs
$Array1 = ("SN1","IN1")
$Array2 = ("SN2","IN2")
$Array3 = ("SN3","IN3")
$Array4 = ("SN4","IN4")

#Hashtable with the string arrays
$ht = @{
    'ID1' = $Array1
    'ID2' = $Array2
    'ID3' = $Array3
    'ID4' = $Array4  
}
从散列中获取值也与预期一样:

$ht.values.get(0)
SN3
SN2
SN4
SN1

$ht.values.get(1) 
IN3
IN2
IN4
IN1
与您期望的键配对相比,源数据是否具有“不匹配”的数组数据

如果数据确实正确,则转换为Json的格式应如下所示:

$ht | ConvertTo-Json
{
    "ID3":  [
                "SN3",
                "IN3"
            ],
    "ID2":  [
                "SN2",
                "IN2"
            ],
    "ID4":  [
                "SN4",
                "IN4"
            ],
    "ID1":  [
                "SN1",
                "IN1"
Edit1
现在查看输出,您可以看到in代码块中有转义字符。如果选中,您将看到您添加了一个回车+新行

因此,数据集中有\r\n个字符,这就是为什么输出会被乱码到新行的原因

Edit2
为这些值添加替换应该可以工作

我不确定您是否需要:

$ht.GetEnumerator() | ForEach-Object {
    New-Object -Type PSObject -Property @{
        'SN' = $_.Value[0].replace("`n","").replace("`r","")
        'IN' = $_.Value[1].replace("`n","").replace("`r","")
    }
} | Select-Object SN, IN | Export-Csv 'output.csv' -NoType
或者这个:

$ht.GetEnumerator() | ForEach-Object {
    New-Object -Type PSObject -Property @{
        'SN' = $_.Value[0].replace("\n","").replace("\r","")
        'IN' = $_.Value[1].replace("\n","").replace("\r","")
    }
} | Select-Object SN, IN | Export-Csv 'output.csv' -NoType

显然,您的字段中的有尾随的换行符,似乎会扰乱数据导入。在导出数据之前修剪它们,一切都应该正常:

$ht.GetEnumerator() | ForEach-Object {
    New-Object -Type PSObject -Property @{
        'SN' = $_.Value[0]
        'IN' = $_.Value[1].Trim()
    }
} | Select-Object SN, IN | Export-Csv 'output.csv' -NoType
$ht.GetEnumerator()| ForEach对象{
新对象-类型PSObject-属性@{
“SN”=$\ 0.Value[0]
'IN'=$\u.Value[1].Trim()
}

}|选择对象序号,在| Export Csv'output.Csv'-NoType
$ht.Values.ForEach{$\uujoin','}| ConvertFrom Csv-Header序号中,在| Export Csv output.Csv
中,您的数据不是您声称的数据。请显示
$ht | converttojson
的输出。我刚刚用您想要的Json结果更新了我的问题@AnsgarWiechersno数据源没有不匹配。我想了想,以前亲自检查过。谢谢你的帮助!你能试着将你的哈希表转换成json并像@ansgar wiechers建议的那样向我们展示结果吗?我刚刚用你想要的json结果更新了我的问题!刚刚更新了我的解释。您的数据集包含转义字符,这会把一切都搞糟:)谢谢您的快速回复!您知道如何摆脱\r\n的吗?作为旁注,如果
新对象
的类型更改为
pscustomobject
选择对象
用于对字段进行排序,则不需要
选择对象
。如果没有它,列顺序将是
IN,SN
。我本可以使用
[PSCustomObject]
类型加速器,而不是
新对象
,后者隐式使用有序哈希表,但这样代码只能在PowerShell v3及更高版本中工作。至于斜体:我使用了一个HTML片段。点击“编辑”查看。很好。在我的脑海里,他正在处理一个默认情况下没有排序的哈希表
$ht.GetEnumerator() | ForEach-Object {
    New-Object -Type PSObject -Property @{
        'SN' = $_.Value[0].replace("\n","").replace("\r","")
        'IN' = $_.Value[1].replace("\n","").replace("\r","")
    }
} | Select-Object SN, IN | Export-Csv 'output.csv' -NoType
$ht.GetEnumerator() | ForEach-Object {
    New-Object -Type PSObject -Property @{
        'SN' = $_.Value[0]
        'IN' = $_.Value[1].Trim()
    }
} | Select-Object SN, IN | Export-Csv 'output.csv' -NoType