2016-04-15 1 views
0

$_の値は、のForEach-Objectループではまだ完全にはわかりません。だから私は2つのcsvファイルの間でレコードをマージする方法がわかりません(レコードをマージする方法がわからない)。Import-Csvは文字列にレコードを割り当てます(csvファイルをメモ帳として開くと表示されます)

私は文字列として2つのCSVファイルの両方から$_を割り当て、その後、ラインとして2つの文字列をマージすることについて考えたが、私はそれが@{column1 = value1_1; column2 = value2_1}のような奇妙な何かにつけず、文字列の中に$_を変換する方法を確信していますvs "value1_1","value2_1"私はこれが最善の解決策であるかどうか、あるいはPowerShellが両方のレコード(ハッシュテーブルのように見える)をマージすることをサポートするかどうかは不明です。ライン62($MergedFileTable += $userInputRecord + $record)で

次のコードのエラーアウト:

Function Main 
{ 
$userInputCsvTable = Import-Csv 'C:\Scripts\Tests\TestCurrent\UserInput.csv' 
$userInputCsvFile = 'C:\Scripts\Tests\TestCurrent\UserInput.csv' 
$DatabaseCsvTable = Import-Csv 'C:\Scripts\Tests\TestCurrent\DatabaseReport.csv' 
$DatabaseCsvFile = 'C:\Scripts\Tests\TestCurrent\DatabaseReport.csv' 
$DatabaseCustomCsvFile = 'C:\Scripts\Tests\TestCurrent\DatabaseReport_Custom.csv' 
$MergedFileTable = @{} 
$MergedFile = 'C:\Scripts\Tests\TestCurrent\Merged.csv' 

[String]$UserInputColumnIDsTitle = 'IDs' 
[String]$UserInputColumnLastNameTitle = 'Last Name' 
[String]$UserInputColumnFirstNameTitle = 'First' 
[String]$DatabaseColumnUserLoginTitle = 'User Login' 
[String]$DatabaseColumnFirstNameTitle = 'First Name' 
[String]$DatabaseColumnLastNameTitle = 'Last Name' 
[String]$DatabaseColumnUserStatusTitle = 'User Status' 
[String]$DatabaseColumnDomain1Title = 'Domain1' 
[String]$DatabaseColumnDomain2Title = 'Domain2' 
[String]$DatabaseColumnDomain3Title = 'Domain3' 
[String]$DatabaseColumnDomain4Title = 'Domain4' 
[String]$DatabaseColumnDomain5Title = 'Domain5' 
[String]$DatabaseColumnDomain6Title = 'Domain6' 

Write-Host "Gathering one list of first and last names from file: $userInputCsvFile..." 
[String[]]$userInputColumnsLastAndFirstNames = @() 
$userInputCsvTable | ForEach-Object { 
    $userInputColumnsLastAndFirstNames += $_.$UserInputColumnLastNameTitle + ' ' + $_.$UserInputColumnFirstNameTitle 
} 
Write-Host "Complete." 

Write-Host "Getting Number of Names..." 
[Int]$numOfNames = $userInputColumnsLastAndFirstNames.Length 
Write-Host "Complete." 

Write-Host "Creating new Database table only with first and last names in list (side-by-side)..." 
[Int]$DisplayCounter = 0 
$DatabaseCsvTable | ForEach-Object { 
    $DisplayCounter++ 
    If ($DisplayCounter % 10000 -eq 0) 
    { 
     Write-Host 'On record ' $DisplayCounter 
    } 
    If ($userInputColumnsLastAndFirstNames -contains ($_.$DatabaseColumnLastNameTitle + ' ' + $_.$DatabaseColumnFirstNameTitle)) 
    { 
     $_ 
    } 
} | Export-Csv $DatabaseCustomCsvFile -NoTypeInformation -Force 
Write-Host "Complete." 

Write-Host "Creating merged file with duplicate records found..." 
$DatabaseCustomCsvTable = Import-Csv $DatabaseCustomCsvFile 
$userInputCsvTable | ForEach-Object { 
    $userInputRecord = $_ 
    $firstName = $_.$UserInputColumnFirstNameTitle 
    $lastName = $_.$UserInputColumnLastNameTitle 
    $matchedTable = $DatabaseCustomCsvTable | Where-Object {($firstName -eq $_.$DatabaseColumnFirstNameTitle) -and ($lastName -eq $_.$DatabaseColumnLastNameTitle)} 
    If ($matchedTable) 
    { 
     ForEach ($record in $matchedTable) 
     { 
      $MergedFileTable += $userInputRecord + $record 
     } 
    } 
} 
Write-Host "Complete." 

Write-Host "Exporting " 
$MergedFileTable | Export-Csv $MergedFile -Force -NoTypeInformation 
} 

Main 

エラー:

Method invocation failed because [System.Management.Automation.PSObject] doesn't contain a method named 'op_Addition'. 
At C:\Scripts\Tests\TestCurrent\test1.ps1:62 char:5 
+     $MergedFileTable += $userInputRecord + $record 
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (op_Addition:String) [], RuntimeException 
    + FullyQualifiedErrorId : MethodNotFound 

任意のアイデアをどのようにこれを行うには?

答えて

0

私は本当にこれを行うには、簡単な方法はありませんでした...ここで

# create 2 merged file contents 
Write-Host "Searching DB (with each search found) 
and creating 2 merged record file contents in memory (one with duplicate records) (one with single records)..." 
$UserInputSearchNum = 1 
$searchPrintOutputNum = 5 
[String]$MergedFileColumnsLine = '"' + $UserInputColumnIDsTitle + '","' + $UserInputColumnFirstNameTitle + '","' + $UserInputColumnLastNameTitle + '","' + $UserInputColumnQLActiveTitle + '","' + $DbColumnUserLoginTitle + '","' + $DbColumnFirstNameTitle + '","' + $DbColumnLastNameTitle + '","' + $DbColumnUserStatusTitle + '","' + $DbColumnAdD1Title + '","' + $DbColumnAdD2Title + '","' + $DbColumnAdD3Title + '","' + $DbColumnAdD4Title + '","' + $DbColumnAdD5Title + '","' + $DbColumnAdD6Title + '"' 
$MergedFileContentsSingleRecords = @($MergedFileColumnsLine) 
$MergedFileContentsDuplicateRecords = @($MergedFileColumnsLine) 
Import-Csv $LocalUserInputCsvReportWithPath | ForEach-Object { 
    If ($UserInputSearchNum % $searchPrintOutputNum -eq 0) # Lets user know which search it's on so user can estimate eta on completion 
    { 
     Write-Host "$UserInputSearchNum/$UserInputNumOfSearches searches complete" 
    } 
    [String]$userInputRecord = '"' + $_.$UserInputColumnIDsTitle + '","' + $_.$UserInputColumnFirstNameTitle + '","' + $_.$UserInputColumnLastNameTitle + '","' + $_.$UserInputColumnQLActiveTitle + '"' 
    $firstAndLastName = $_.$UserInputColumnFirstNameTitle + ' ' + $_.$UserInputColumnLastNameTitle 

    $matchedDbRecordTable = Import-Csv $LocalDbCustomReportFileWithPath | Where-Object {$firstAndLastName -eq ($_.$DbColumnFirstNameTitle + ' ' + $_.$DbColumnLastNameTitle)} 
    If ($matchedDbRecordTable) 
    { 
     If ($matchedDbRecordTable.length -gt 1) 
     { 
      $matchedDbRecordTable | ForEach-Object { 
       $MergedFileContentsDuplicateRecords += $userInputRecord + ',"' + $_.$DbColumnUserLoginTitle + '","' + $_.$DbColumnFirstNameTitle + '","' + $_.$DbColumnLastNameTitle + '","' + $_.$DbColumnUserStatusTitle + '","' + $_.$DbColumnAdD1Title + '","' + $_.$DbColumnAdD2Title + '","' + $_.$DbColumnAdD3Title + '","' + $_.$DbColumnAdD4Title + '","' + $_.$DbColumnAdD5Title + '","' + $_.$DbColumnAdD6Title + '"' 
      } | Out-Null 
     } Else { 
      $matchedDbRecordTable | ForEach-Object { 
       $MergedFileContentsSingleRecords += $userInputRecord + ',"' + $_.$DbColumnUserLoginTitle + '","' + $_.$DbColumnFirstNameTitle + '","' + $_.$DbColumnLastNameTitle + '","' + $_.$DbColumnUserStatusTitle + '","' + $_.$DbColumnAdD1Title + '","' + $_.$DbColumnAdD2Title + '","' + $_.$DbColumnAdD3Title + '","' + $_.$DbColumnAdD4Title + '","' + $_.$DbColumnAdD5Title + '","' + $_.$DbColumnAdD6Title + '"' 
      } | Out-Null 
     } 
    } Else { 
     $MergedFileContentsSingleRecords += $userInputRecord + ',"Not Found","Not Found","Not Found","Not Found","Not Found","Not Found","Not Found","Not Found","Not Found","Not Found"' 
    } 
    $UserInputSearchNum++ 
} | Out-Null 
Write-Host "Complete." 
Write-Host '' 

は、完全なテストスクリプトで推測:ここhttps://gist.github.com/vardahoth/24649da587afc3d838234ab2398c8f80

は(テスト用)のユーザー入力ファイルです:https://gist.github.com/vardahoth/864c90325d4e4dc4cf6921bf3b352ff5

ここで

(テスト用)、DB入力ファイルは次のとおりです。https://gist.github.com/vardahoth/81beb4340b9a4d765ebe7b6361d12e30

これはテストだけを実行するには数秒かかります。ただし、2つのファイルを33000 * 34000レコードでマージするのに約60時間かかります(両方のファイルにある重複ファイルに対応しています)。

マージメソッドをサポートするライブラリを知っている人がいれば、大きな助けになるでしょう。ありがとう。

関連する問題