我有输入文件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
如评论中所述,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