0

そこにあるすべての例で、あなたは私が私の解決策を見つけることができたと思うでしょう. :-)

とにかく、2 つの csv ファイルがあります。1 つは 2 列、もう 1 つは 4 です。powershell を使用して、それぞれの列から 1 つの列を比較する必要があります。私はそれを理解したと思っていましたが、結果を比較すると、真実であるべきだとわかっているのに偽として戻ってきました。これが私がこれまでに持っているものです:

 $newemp = Import-Csv -Path "C:\Temp\newemp.csv" -Header login_id, lastname, firstname, other | Select-Object "login_id"
 $ps = Import-Csv -Path "C:\Temp\Emplid_LoginID.csv" | Select-Object "login id"
 If ($newemp -eq $ps)
    {
      write-host "IDs match" -forgroundcolor green
    }
 Else 
    {
      write-host "Not all IDs match" -backgroundcolor yellow -foregroundcolor black
    }

最初のファイルにはヘッダーがないため、ヘッダーを指定する必要がありました。奇妙なのは、各変数を呼び出して、それが何を保持しているかを確認できることです。最終的には同じ情報になりますが、何らかの理由でまだ false になります。これは、行が 1 つしかない場合でも発生します (ヘッダー行は数えません)。

それらを配列として解析し始めましたが、それが正しいことであるかどうかはよくわかりませんでした。重要なのは、最初のファイルの行 1 と 2 番目のファイルの行 1 を比較することです。単純な -match または -contains を実行することはできません。

編集: 厄介なことの 1 つは、変数がヘッダー行も保持しているように見えることです。それぞれを呼び出すと、ヘッダーが表示されます。しかし、両方の変数を呼び出すと、ヘッダーは 1 つしか表示されず、行は 2 つ表示されます。

次のチェックを追加しましたが、同じ結果が得られました (すべて False)。

    $results = Compare-Object -ReferenceObject $newemp -DifferenceObject $ps -PassThru | ForEach-Object { $_.InputObject }
4

3 に答える 3

3

hereのlatkinの回答を使用すると、探している結果セットが得られると思います。latkin のコメントによると、プロパティの比較は目的のために冗長ですが、知っておくとよいので残しました。さらに、ヘッダー行が比較に含まれないように、ヘッダー付きの csv に対してもヘッダーが指定されます。

$newemp = Import-Csv -Path "C:\Temp\_sotemp\Book1.csv" -Header loginid | 
    Select-Object "loginid"

$ps = Import-Csv -Path "C:\Temp\_sotemp\Book2.csv" -Header loginid | 
    Select-Object "loginid"

#get list of (imported) CSV properties
$props1 = $newemp | gm -MemberType NoteProperty | select -expand Name | sort
$props2 = $ps | gm -MemberType NoteProperty | select -expand Name | sort

#first check that properties match 
#omit this step if you know for sure they will be
if(Compare-Object $props1 $props2){
    throw "Properties are not the same! [$props1] [$props2]"
}

#pass properties list to Compare-Object
else{
    Compare-Object $newemp $ps -Property $props1
}
于 2013-08-21T17:57:34.667 に答える
2

これがあなたが探しているものかどうかはわかりませんが、PowerShell を使用して自分で CSV の書式設定を行いました。

            $test = Import-Csv .\Desktop\Vmtools-compare.csv
                foreach ($i in $test) {
                    foreach ($n in $i.name) {    
                        foreach ($m in $test) {
                            $check = "yes"         
                            if ($n -eq $m.prod) {
                                $check = "no"
                                break
                            }
                        }
                    if ($check -ne "no") {$n}
                    }
                }

これは私のExcel csvファイルがどのように見えるかです:

prod    name
1       3
2       5
3       8
4       2
5       0

そしてスクリプトはこれを出力します:

8
0

したがって、基本的にスクリプトは Name 列の下の各番号を取得し、それを prod 列に対してチェックします。番号がそこにある場合は表示されず、それ以外の場合はその番号が表示されます。

私も逆の方法でそれを行いました:

        $test = Import-Csv c:\test.csv                
            foreach ($i in $test) {
                foreach ($n in $i.name) {                    
                    foreach ($m in $test) {
                        $check = "yes"                         
                        if ($n -eq $m.prod) {echo $n}
                    }
                }
            }

これは私のExcelのcsvがどのように見えるかです:

prod    name
1       3
2       5
3       8
4       2
5       0

そしてスクリプトはこれを出力します:

3
5
2

そのため、スクリプトは一致するエントリのみを表示します。

コードをいじって、さまざまな列を確認できます。

于 2013-10-16T18:15:22.313 に答える
2

2 行目に「login id」というスペースがありますが、1 行目にはありません。それが問題になる可能性があります。.csv ファイル自体のヘッダーに同じ名前を付けてみてください。また、ヘッダーや選択ステートメントを提供しなくても機能します。以下は、あなたの入力に基づく私の実験です。

emp.csv

loginid      firstname  lastname
------------------------------
abc123   John       patel  
zxy321   Kohn       smith  
sdf120   Maun       scott  
tiy123   Dham       rye  
k2340    Naam       mason  
lk10j5   Shaan      kelso  
303sk    Doug       smith  

empids.csv

loginid
-------  
abc123  
zxy321  
sdf120  
tiy123  

PS C:\>$newemp = Import-csv C:\scripts\emp.csv
PS C:\>$ps = Import-CSV C:\scripts\empids.csv
PS C:\>$results = Compare-Object - ReferenceObject $newemp -DifferenceObject $ps | foreach { $_.InputObject}

$ps にない差分オブジェクトを表示します

loginid  firstname  lastname   SideIndicator  
-------  ---------  --------   -------------  
k2340    Naam       mason      <=  
lk10j5   Shaan      kelso      <=  
303sk    Doug       smith      <=  
于 2013-08-21T18:01:23.947 に答える