2015-04-16 101 views
1

我正在使用powershell導入包含有關書籍信息的csv文件。像:標題,idnum,作者等...我試圖比較每個屬性,看看它是否等於「」或null。所以,我有什麼是:在powershell中比較屬性

Import-Csv C:\location.csv | Foreach-Object{ 
    foreach($property in $_.PSObject.Properties) 
    { 
     if($Property -eq "") 
     { 
      Write-Host yes 
     } 
    } 
} 

我知道,只是說當量「」總不爲空值的工作,但問題是,即使我把當量「古登」,和古登確實存在幾次在列表中,if語句不起作用。無財產是有史以來等於「古登」

回答

1

你應該先用性質作品名稱是這樣的:

Import-Csv C:\location.csv | Foreach-Object { 
    $a=$_; 
    $_.Psobject.properties | % { 
    if ($a.$($_.name)-eq 0){ 
     Write-Host "$($_.name) is 0"} 
    } 
    } 
1

如果需要確定屬性爲null,PowerShell有一個內置的vriable的比較就像這個一樣。

此外,您需要使用引號才能使用寫主機,所以這裏是如何查看屬性是否爲空的示例,如果是,請將屬性的名稱寫入屏幕。

If ($property.Value -eq $null){ 
    Write-host "$($property.Name) - This property is null"} 

這就是說,這是一個奇怪的請求,你正在做。人們經常問我們如何在Stack上做些奇怪的事情,當時他們真的需要做一些共同的事情,而不是問怎麼做。

就這麼說,除了這個技術問題之外,你的最終目標是什麼?

如果您可以詳細說明,我可以通過更好的方法來幫助您。

+0

我試着去統計有多少空值它們是整個CSV,我認爲這將通過遍歷每個領域是最好的方法 – user1807844

1

就個人而言,如果您正在查找具有空值或空值的屬性,我會處理它稍微慢一些,並使用[String]方法IsNullOrWhitespace()。我想RegEx匹配"^\w*?$"-or $_ -eq $null會做同樣的事情,但這對我來說似乎更清潔,爲什麼重新發明輪子?

現在,你想檢查所有的屬性,或只是特定的?如果你想看到有空任何字段,你可以這樣做的所有條目:

$AllBooks = import-csv c:\path\to\file.csv 
$Props = $AllBooks[0] | Get-Member -MemberType Properties | Select -Expand Name 
ForEach($Book in $AllBooks){ 
    If(($Props | Where{[String]::IsNullOrWhiteSpace($Book.$_)}).Count -gt 0){$Book} 
} 

如果你不關心的是空格,你可以使用IsNullOrEmpty()這是更快,或者你可以做[String]:IsNullOrEmpty($Book.$_.Trim())刪除條目任何空格。

該代碼將導入CSV,從第一個條目收集可能的屬性列表(導入的CSV所有記錄都應該具有相同的屬性,這應該是安全的)。然後,對於每條記錄,它將循環屬性列表,並檢查它們中的任何一條是否爲該記錄爲空,如果是,則輸出該記錄。如果你想收集這些條目,你可以收集整個ForEach循環的變量。例如:

$BadEntries = ForEach($Book in $AllBooks){ 

然後,您將有$ BadEntries使用。

如果只用一個領域而言,說「標題」,這成爲可笑的簡單...

$AllBooks | Where{[string]::IsNullOrEmpty($_.Title.Trim())}