2012-04-04 50 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