将哈希表中的数组导出到没有空行的 CSV
exporting an array inside a hashtable to CSV without blank rows
我有一个哈希表,其中包含字符串数组作为值,例如
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 文件时跳过这些空行?
我已经尝试复制您看到的错误,但我没有得到相同的结果。
我怀疑这可能与你的数组有关,但很难知道,因为我看不到你的数据来源。
这是我的测试复制:
#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
与您期望的键配对相比,您的源数据是否具有 "mismatched" 数组数据?
如果数据确实正确,ConvertTo-Json应该是这样的:
$ht | ConvertTo-Json
{
"ID3": [
"SN3",
"IN3"
],
"ID2": [
"SN2",
"IN2"
],
"ID4": [
"SN4",
"IN4"
],
"ID1": [
"SN1",
"IN1"
编辑1
现在查看您的输出,您可以看到您的 IN 代码块中有转义字符。如果你检查 Powershell Escape Character Syntax 你会看到你添加了一个 Carriage return + New line
因此您的数据集中有 \r\n,这就是为什么您的输出会被换行。
编辑2
为值添加替换应该有效。
我不确定你是否需要这个:
$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
显然您的 IN
字段有尾随换行符,这似乎会扰乱您的数据导入。 Trim 他们在导出数据之前,一切都应该没问题:
$ht.GetEnumerator() | ForEach-Object {
New-Object -Type PSObject -Property @{
'SN' = $_.Value[0]
'IN' = $_.Value[1]<b><i>.Trim()</i></b>
}
} | Select-Object SN, IN | Export-Csv 'output.csv' -NoType
我有一个哈希表,其中包含字符串数组作为值,例如
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 文件时跳过这些空行?
我已经尝试复制您看到的错误,但我没有得到相同的结果。 我怀疑这可能与你的数组有关,但很难知道,因为我看不到你的数据来源。
这是我的测试复制:
#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
与您期望的键配对相比,您的源数据是否具有 "mismatched" 数组数据?
如果数据确实正确,ConvertTo-Json应该是这样的:
$ht | ConvertTo-Json
{
"ID3": [
"SN3",
"IN3"
],
"ID2": [
"SN2",
"IN2"
],
"ID4": [
"SN4",
"IN4"
],
"ID1": [
"SN1",
"IN1"
编辑1
现在查看您的输出,您可以看到您的 IN 代码块中有转义字符。如果你检查 Powershell Escape Character Syntax 你会看到你添加了一个 Carriage return + New line
因此您的数据集中有 \r\n,这就是为什么您的输出会被换行。
编辑2
为值添加替换应该有效。
我不确定你是否需要这个:
$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
显然您的 IN
字段有尾随换行符,这似乎会扰乱您的数据导入。 Trim 他们在导出数据之前,一切都应该没问题:
$ht.GetEnumerator() | ForEach-Object {
New-Object -Type PSObject -Property @{
'SN' = $_.Value[0]
'IN' = $_.Value[1]<b><i>.Trim()</i></b>
}
} | Select-Object SN, IN | Export-Csv 'output.csv' -NoType