2015-06-26 5 views
0

Следующий кодКак проверить пустое/нулевое значение CSV?

"a,b,c 
1,1,1 
2,,2 
3,3,3" > test.csv 

import-csv test.csv | select b | % { 
    Write-Host "$_ $([string]::IsNullOrEmpty($_))" 
} 

возвращает

 
@{b=1} False 
@{b=} False 
@{b=3} False 

Однако, я ожидал, что второй линии возврата True. Я пробовал $_ -eq $null -or $_ -eq '' и ничего, если они работают?

ответ

2

Вопрос заключается в том, что внутри блока % { }$_ не содержит значение столбца b, а скорее объект с b свойством. Когда вы запускаете [string]::IsNullOrEmpty($_), вы проверяете, является ли этот объект пустой или пустой, ни одна из которых не является истинной.

Для того, чтобы проиллюстрировать, что происходит, сравните результаты ...

Import-Csv .\test.csv | Get-Member 

... с результатами ...

Import-Csv .\test.csv | select b | Get-Member 

... с результатами ...

Import-Csv .\test.csv | select -ExpandProperty b | Get-Member 

Одно из решений заключается в проверке, если b свойство объекта производства select (А не сам объект) является нулевым или пустым:

import-csv test.csv | select b | % { 
    Write-Host "$_ $([string]::IsNullOrEmpty($_.b))" 
} 

Другим решением является передача только значение столбца b к % { } блока:

import-csv test.csv | select -ExpandProperty b | % { 
    Write-Host "$_ $([string]::IsNullOrEmpty($_))" 
} 
+0

Ahhhh взял мой ответ из-под меня. – Matt

+0

@Matt Меня зовут Мэтт. Мы были склонны отвечать таким образом. – BACON

0

Я нашел следующий код работает.

import-csv test.csv | select b | % { 
    Write-Host "$_ $($_.b -eq '')" 
} 

Есть ли другие решения?

0

В вашем примере в вопросе есть еще объект, содержащий пустой параметр b. Рассмотрим следующее, которое показывает, почему вы получили результат, который вы сделали.

PS C:\Users\matt> @{} -eq $null 
False 

Остальная часть этого было бы расширить собственность так же, как в Bacon's answer

Смежные вопросы