如何在 powershell 中过滤列中的空值

问题描述 投票:0回答:1

我有输入文件text.csv

"#P","A","E","S"
"1","2","3","4"
"3","5","6",""
"A","B","C",""
"D","F","G","H"

我想要输出 csv 文件 export.csv as

"P","A","E","S"
"1","2","3","4"
"D","F","G","H"




 $File1 = Import-Csv -Path "test.csv" -Header "P","A","E","S" | Where { $_.S -ne $null } | Export-Csv "export.csv" -Force -NoTypeInformation
powershell null multiple-columns is-empty
1个回答
0
投票

如评论中所述,csv 文件通常以纯文本格式存储表格数据(数字和文本),在这种情况下,每一行将具有相同数量的字段。

基于此,您可能会认为您永远不应该有一个

$Null
,而只是一个空字符串:

$Csv = @'
1,2,3,4
3,5,6,
A,B,C,
D,F,G,H
'@
$Csv |ConvertFrom-Csv -Header "P","A","E","S" |
    ForEach-Object { if ($Null -eq $_.S) { 'Null' } else { 'String' } }

String
String
String
String

但要小心这个假设,不幸的是,情况并非总是如此。如果不仅省略了最后一个值,还省略了前面的逗号(请注意,在以下示例中,

A,B,C
后面没有逗号):

$Csv = @'
1,2,3,4
3,5,6,
A,B,C
D,F,G,H
'@
$Csv |ConvertFrom-Csv -Header "P","A","E","S" |
    ForEach-Object { if ($Null -eq $_.S) { 'Null' } else { 'String' } }

String
String
Null
String

除此之外,

Import-Csv
ConvertFrom-Csv
命令中存在一个错误,其中 ConvertFrom-Csv 读取的空列的最后一个单元格不一致
$Null
#17702

$Csv = @'
1,2,3,
3,5,6,
A,B,C,
D,F,G,
'@
$Csv |ConvertFrom-Csv -Header "P","A","E","S" |
    ForEach-Object { if ($Null -eq $_.S) { 'Null' } else { 'String' } }

String
String
String
Null

因此,我会比抱歉更安全,并测试

$Null
(
$Null -ne $_.S
)1) and 一个空字符串 (
$_.S -ne ''
) 可以简化为:
... |Where-Object { $_.S } |...
这个结果在所谓的“Truthy”条件下,如果相关字段不为空(或
$Null
),另请参见Conversion to Bool

$Csv = @'     # Or as in your revised question:
1,2,3,4       # "1","2","3","4"
3,5,6,        # "3","5","6",""
A,B,C,        # "A","B","C",""
D,F,G,H       # "D","F","G","H"
'@
# Import-Csv -Path "test.csv" -Header "P","A","E","S" |
#     Where-Object { $_.S } |Export-Csv "export.csv" -Force -NoTypeInformation
$Csv |ConvertFrom-Csv -Header "P","A","E","S" |
    Where-Object { $_.S } |ConvertTo-Csv

"P","A","E","S"
"1","2","3","4"
"D","F","G","H"

1)如果你检查

$Null
;
$Null
应该在比较运算符的左边

© www.soinside.com 2019 - 2024. All rights reserved.