2012-04-04 2 views
1

내가 수행 할 수있는 작업은 해시 테이블 (데이터베이스의 사용자 정보) 배열을 사용하여 csv 파일 (웹 로그 일 수 있음)을 필터링하는 것입니다.해시 테이블 배열로 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

+0

@Data는 System.Data.DataTable을 반환하는 함수에서 가져온 것입니다. 관련 데이터를 가져와 해시 테이블에 배치하기 위해 루프를 반복하고 있습니다. – chris

답변

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

+0

오타가 아닌'Select {& _ LoginId}'는'Select {$ _. LoginId}'이어야합니다. 그건 제쳐두고,하지만 여전히 작동하지 않을 수도 있습니다. Select cmdlet 다음에 Get-Member 호출을 사용하십시오. $ users | {$ _. LoginId}를 선택하십시오. Get-Member'. V3 베타 버전에서는 속성을 추가 한 해시 테이블을 얻습니다 ($ _. LoginId). v2에서는 PSCustomObject를 얻은 것으로 보입니다. 원래의 접근 방식은'$ u = $ users | Foreach {$ _. LoginId}'. LoginId 값만 추출합니다. –

+0

제 지식을 넓혀 주셔서 감사합니다. – chris