2012-04-04 28 views
1

我正在嘗試的是使用哈希表(來自數據庫的用戶信息)數組篩選csv文件(恰好是weblog)。通過哈希表數組篩選csv文件

#$data is from a database. (about 500 items) Type: System.Data.DataTable 
$users = @() 
foreach($row in $data) 
{ 
    $userItem = @{ 
     LoginId = $row[0] 
     LastName = $row[3] 
     FirstName = $row[4] 
     LastAccess = $null 
    } 
    $users += $userItem 
} 
#Log files are about 14,000 lines long 
$logfiles = Get-ChildItem $logFolder -Recurse | where {$_.Extension -eq ".log"} | Sort-Object BaseName -Descending 
foreach($log in $logfiles) 
{ 
    $csvLog = Import-Csv $log.FullName -Header ("Blank","LoginId","Date") 
    $u = $users | Select {&_.LoginId} 
    $filteredcsvLog = $cvsLog | Where-Object { $u -contains $_.LoginId} 
    #This returns null 
    .... 

} 

這似乎不起作用,我錯過了什麼。我的猜測是,我需要將數組變成[string []],但我似乎無法做到這一點。

+0

,我注意到的第一件事情: $ data是CSV嗎?我沒有看到任何實際上將$ row分割成數組的情況。 – EBGreen 2012-04-04 16:39:28

+0

@Data來自一個返回System.Data.DataTable的函數,我循環它們只是爲了拉出相關數據並將其放置在HashTable中 – chris 2012-04-04 16:44:44

回答

1

而不是做哈希表的數組,我會做定製的哈希表對象如:

$users = @{} 
foreach($row in $data) 
{ 
    $userItem = new-object psobject -property @{ 
     LoginId = $row[0] 
     LastName = $row[3] 
     FirstName = $row[4] 
     LastAccess = $null 
    } 
    $users[$userItem.LoginId] = $userItem 
} 

然後過濾更容易和更快:

foreach($log in $logfiles) 
{ 
    $csvLog = Import-Csv $log.FullName -Header ("Blank","LoginId","Date") 
    $filteredcsvLog = $cvsLog | Where-Object { $users[$_.LoginId} } 
    .... 
} 
+0

工作正常,我喜歡解決方案比我的更好,但有一個問題,爲什麼不是我原來的工作方式?我的Where-Object語句的哪部分是錯誤的? – chris 2012-04-04 16:56:12

+0

不確定這是否是一個錯字,但是'Select {&_。LoginId}'應該是'Select {$ _。LoginId}'。除此之外,但它仍然可能不起作用。在Select cmdlet'$ users |「之後,將一個調用粘貼到Get-Member上選擇{$ _。LoginId} | GET-Member'。在V3測試版中,我添加了一個屬性($ _。LoginId)以獲得散列表。在v2上,我認爲你會得到一個PSCustomObject。你原來的做法應該是'$ u = $ users | Foreach {$ _。LoginId}'。這只是提取LoginId值。 – 2012-04-04 17:17:38

+0

感謝您拓展我的知識。 – chris 2012-04-04 19:46:45