2つのExcelファイルまたはシートを比較できるスクリプトを作成する必要があります。また、セルの1つが同じでない場合は、どちらのファイルであるかを教えてくださいこれを行う方法を知っている、私はこのような別の状況を見たが、私はあなたが私を助けることができませんでしたか? 私のファイルはtest1.csvとtest2.csvですPowerShell:Excelファイル2枚または2枚を比較する
答えて
これを試してください。
$file1 = Import-Csv test1.csv
$file2 = Import-Csv test2.csv
Compare-Object $file1 $file2 -property "HeaderProperty" -IncludeEqual
@Vivekクマールは:注意してください、Compare-Object
はデフォルトで値を持っており、それは結果の一部のみを与えることができ-SyncWindow
パラメータがあります。
この「問題」を回避する一つの方法は、2で-ReferenceObject
を分割することで-SyncWindow
を設定することです:
$file1 = Import-Csv test1.csv
$file2 = Import-Csv test2.csv
Compare-Object -ReferenceObject $file1 -DifferenceObject $file2 -SyncWindow ($file1.length/2)
あなたはファイルがCSVある言及しているので、あなたは標準的なPS機能で必要なすべてを行うことができます。
ただし、Excel(XLSX/XLS)ファイルを使用している場合は、https://github.com/RamblingCookieMonster/PSExcelというライブラリに興味があるかもしれません。 Import-XLSX
の場合はImport-CSV
に切り替えてください。
以下は、これを実行する方法の非常に基本的な例です。テストため
コード
function Report-OffendingCell { #NB: doesn't follow good naming conventions
[CmdletBinding()]
param (
[Parameter(Mandatory=$true, ValueFromPipeline = $true)]
[long]$ColumnIndex
,
[Parameter(Mandatory=$true)]
[long]$RowIndex
,
[Parameter(Mandatory=$true)]
[string]$SheetName
,
[Parameter(Mandatory=$false)]
[string]$Explanation
)
process {
#If you want column letters instead of numbers, use something like Convert-NumberToA1 from https://gallery.technet.microsoft.com/office/Powershell-function-that-88f9f690
#"[{0}]!{1}{2}" -f $SheetName, (Convert-NumberToA1 $ColumnIndex + 1), ($RowIndex + 1)
#I've returned an object instead, since that's more useful for any further PS automation
(New-Object -TypeName PSObject -Property @{
ColumnNo = $ColumnIndex + 1
RowNo = $RowIndex + 1
SheetName = $SheetName
Explanation = $Explanation
})
}
}
function Compare-Tables {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)]
[PSObject[]]$Table1
,
[Parameter(Mandatory=$true)]
[PSObject[]]$Table2
,
[Parameter(Mandatory=$false)]
[string]$Table1Name = 'Table1'
,
[Parameter(Mandatory=$false)]
[string]$Table2Name = 'Table2'
)
begin {
[long]$t1Cols = ($Table1[0].PSObject.Properties | Measure-Object).Count - 1
[long]$t2Cols = ($Table2[0].PSObject.Properties | Measure-Object).Count - 1
[long]$t1Rows = $Table1.Count - 1
[long]$t2Rows = $Table2.Count - 1
[long]$minCols = [System.Math]::Min($t1Cols, $t2Cols)
[long]$maxCols = [System.Math]::Max($t1Cols, $t2Cols)
[long]$minRows = [System.Math]::Min($t1Rows, $t2Rows)
[long]$maxRows = [System.Math]::Max($t1Rows, $t2Rows)
[string]$offendingColTable = if ($maxCols -eq $t1Cols){$Table1Name}else{$Table2Name}
[string]$offendingRowTable = if ($maxRows -eq $t1Rows){$Table1Name}else{$Table2Name}
write-verbose $offendingColTable
write-verbose $offendingRowTable
write-verbose $maxCols
write-verbose $t1Cols
write-verbose $t2Cols
}
process {
0..$minRows | %{ #loop through each row which is populated in both sheets
[long]$row = $_
0..$minCols |
?{(@($Table1[$row].PSObject.Properties)[$_].Value) -ne (@($Table2[$row].PSObject.Properties)[$_].Value)} |
Report-OffendingCell -RowIndex $row -SheetName $Table2Name -Explanation 'Values differ between sheets!' #sheetname could be Table1 or Table2 here; since the cell exists in both sheets
($minCols + 1)..$maxCols | Report-OffendingCell -RowIndex $row -SheetName $offendingColTable -Explanation 'Entire Column only exists on one sheet!'
}
($minRows + 1)..$maxRows | %{ #for any rows which don't exist in one of the sheets, output that
[long]$row = $_
0..$maxCols | Report-OffendingCell -RowIndex $row -SheetName $offendingRowTable -Explanation 'Entire Row only exists on one sheet!'
}
}
}
$test1 = Import-CSV -Path '.\test1.csv'
$test2 = Import-CSV -Path '.\test2.csv'
Compare-Tables -Table1 $test1 -Table2 $test2 -Table1Name 'test1' -Table2Name 'test2' -Verbose | ft SheetName, ColumnNo, RowNo, Explanation
#just so I don't mess up your session with my mock
if((Get-Command Import-Csv).Source -ne 'Microsoft.PowerShell.Utility') {
Remove-Item 'function:Import-Csv'
}
コード
次のコードを使用することができ、以下の例の出力を提供します。これにより、Import-CSV関数は固定値のデータを単に返す関数の模擬バージョンで上書きされます。このコードは実際のシナリオでは必須ではありません。試してみたいものがある適切なテスト用のCSVファイルを持っていない人のためだけです。
#region 'Mocked Standard Functions'
#you don't need this function; this is just to make testing simple
function Import-CSV {
param($Path)
switch ($Path) {
'.\test1.csv' {
@(
@{
'Column A Heading'='Row 1 Cell 1';
'Column B Heading'='Row 1 Cell 2';
'Column C Heading'='Row 1 Cell 3';
'Column D Heading'='Row 1 Cell 4';
}
, @{
'Column A Heading'='Row 2 Cell 1';
'Column B Heading'='Row 2 Cell 2';
'Column C Heading'='Row 2 Cell 3';
'Column D Heading'='Row 2 Cell 4';
}
, @{
'Column A Heading'='Row 3 Cell 1';
'Column B Heading'='Row 3 Cell 2';
'Column C Heading'='Row 3 Cell 3';
'Column D Heading'='Row 3 Cell 4';
}
) | %{(New-Object -TypeName PSObject -Property $_)} | select 'Column A Heading', 'Column B Heading', 'Column C Heading', 'Column D Heading' #select needed to ensure columns are returned in the correct order
}
'.\test2.csv' {
@(
@{
'Column Heading 1'='Row 1 Cell 1';
'Column B Heading'='Row 1 Cell 2';
'Column C Heading'='Row 1 Cell 3 difference';
'Column D Heading'='Row 1 Cell 4';
}
, @{
'Column Heading 1'='Row 2 Cell 1';
'Column B Heading'='Row 2 Cell 2';
'Column C Heading'='Row 2 Cell 3';
'Column D Heading'='Row 2 Cell 4';
'Column E Heading'='Row 2 Cell 5 bonus ball!'; #note that though we've not defined on the previous "row", the import function assumes a table, so we'll still have a property on the previous row; only it'll be null
}
) | %{(New-Object -TypeName PSObject -Property $_)}| select 'Column Heading 1', 'Column B Heading', 'Column C Heading', 'Column D Heading', 'Column E Heading' #select needed to ensure columns are returned in the correct order
}
default {throw "no dummy data defined for $Path"}
}
}
#endregion 'Mocked Standard Functions'
出力例
SheetName ColumnNo RowNo Explanation
--------- -------- ----- -----------
test2 3 1 Values differ between sheets!
test2 5 1 Entire Column only exists on one sheet!
test2 5 2 Entire Column only exists on one sheet!
test1 1 3 Entire Row only exists on one sheet!
test1 2 3 Entire Row only exists on one sheet!
test1 3 3 Entire Row only exists on one sheet!
test1 4 3 Entire Row only exists on one sheet!
test1 5 3 Entire Row only exists on one sheet!
申し訳ありませんが、データでこれを行うにはどうすればいいですか? – charlo
確か;上記のコードを実行しますが、 '#region 'Mocked Standard Functions'セクションにコードを含めないでください。すなわち、 'import-csv'関数を上書きして、それらのCSVファイルがない場合でも、次のコードが誰かのために働くようにします。私はその追加のコードを分けることで、より明確にしようとします。 – JohnLBevan
私は少し問題があります。私はスクリプトを実行すると結果がセルごとに表示されますが、2つのセルと各列に同じことが表示されます1:値はシートとセルの間で値が異なります – charlo
- 1. 2枚の差異を比較する
- 2. 2枚の画像を比較できますか?
- 3. アレイを使用して2枚のシートを比較する
- 4. 2枚のシート間の行を比較する - 機能
- 5. エクセルは2枚
- 6. 2枚のExcelシートを比較し、データをシート1にコピー
- 7. 2枚目の3列を比較すると、1枚目の4列目の値が2枚目と一致する場合
- 8. データ辞書に基づいて2枚のシートを比較するVBAコード
- 9. 2枚の画像は
- 10. 2枚のシートを比較して比較するか、シートの変更を検出する
- 11. 2枚のシートを比較し、シート1の値を置き換えるVBA
- 12. 2枚のExcelシートを比較して差異を見つけよう
- 13. 2枚の画像の比率の差を取得する
- 14. 2枚のレンズを作る方法は?
- 15. 角材2枚スクロール可能
- 16. 1枚目から2枚目までのデータを参照する
- 17. 私は2枚のシートの1
- 18. バビロンズは2枚の画像を重ねて表示し、2枚目の画像は透明です。
- 19. VBAは、2枚のシートを比較しながらセルを交換して追加します。
- 20. HTMLで4枚の画像を2 * 2に揃えるには?
- 21. Rephotography(または2枚の写真を照合)
- 22. 2枚の画像を並べて配置すると、ブートストラップで2枚目の画像が表示される
- 23. 2枚のシート間の計算をExcel
- 24. excelで2枚のシート間のデータを比較しながら一般的なパスを与えるには?
- 25. 2枚以上の画像のステッチング
- 26. 2枚の画像の減算
- 27. VLOOKUP/2枚のインデックスと複数の値
- 28. 2枚のシートにまたがる条件付き書式
- 29. VBA Excel_Compare and Count:2枚のシートのセルを比較して遅れをカウントする
- 30. UIB-カルーセル画像の配列から1枚のスライドに2枚の画像
それは興味深い記事だが、それだけで '-SyncWindow'は_version 2では5にデフォルト設定とabove_ PowerShellの_version 1_、に適用される、しかし、"既定値は[Int32] :: MaxValueです。つまり、このコマンドレットはオブジェクトコレクション全体を検査します。 - https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/compare-object – mklement0