将哈希表中的数组导出为CSV且无空白行

时间:2018-07-23 18:07:10

标签: powershell export-to-csv

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

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 

$ht.values.get(1) 

给我

IN1
IN2


IN3
IN4

它将在值之间给出空白行。 但是我在带有计数器$ n的常规forloop中打印出值, 例如

$ht.values.get(0).get($n)
$ht.values.get(1).get($n)

我没有空白行。

当我转换为Json时,我得到了

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

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

2 个答案:

答案 0 :(得分:3)

显然,您的IN字段的尾随换行符似乎干扰了数据导入。在导出数据之前对其进行修剪,然后一切都会正常:

$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

答案 1 :(得分:0)

我尝试复制您看到的错误,但没有得到相同的结果。 我怀疑它可能与您的数组有关,但是由于我看不到您的数据源,因此很难知道。

这是我的测试副本:

#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

与键解析的期望值相比,源数据是否具有“不匹配”的数组数据?

如果数据确实正确,那么ConvertTo-Json应该如下所示:

$ht | ConvertTo-Json
{
    "ID3":  [
                "SN3",
                "IN3"
            ],
    "ID2":  [
                "SN2",
                "IN2"
            ],
    "ID4":  [
                "SN4",
                "IN4"
            ],
    "ID1":  [
                "SN1",
                "IN1"

编辑1
现在看到输出,您可以看到IN代码块中有转义字符。如果您选中Powershell Escape Character Syntax,则会看到您添加了回车+新行

所以数据集中有\ 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