PowerShell CSV比较

时间:2013-12-31 05:26:30

标签: powershell csv

我对Powershell非常,非常非常新。我想知道是否有人帮助我使用以下脚本:

我们的想法是拥有两个excel电子表格。

1.csv

Q码 PC1009 PC1009 PC1011 PC1012

2.csv

Q码 PC1009 PC1009 PC1009 PC1012

我正在尝试比较两个CSV文档之间的值。如果1.csv中cell1中的值等于2.csv中的任何单元格,则脚本必须执行某个操作,一旦操作完成,它必须循​​环到1.csv中的cell2并再次将其与所有值进行比较2.csv

这就是我所管理的事情:

$CSV=Import-Csv C:\1.csv
$COMP=Import-Csv C:\2.csv
$count=0
$cnt=0

while($count -le $CSV.Count)
{



while($validator -eq $false)
{
if($CSV[$count].QCODE -eq $COMP[$cnt].QCODE)
{
Write-Host "Exiting"
$validator=$true
}

else{
$cnt++
}
}



$count++

 }

这是一团糟,我道歉。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

这是一个适合您的解决方案。我创建了两个带有匹配标头的CSV文件。列名是:

  • PROP1
  • PROP2
  • Prop3
  • Prop4
  • Prop5

将这些行导入PowerShell后,它会自动为每一行创建一个PSObject。 PSObject上的属性名称将是列标题。这两个CSV文件存在于名为c:\test的文件夹中。

注意:两个文件之间存在单个不匹配的值,处于死区。这将是我们的考验。

CSV files

代码看起来像这样。有一些内嵌评论可以帮助指导您。基本上,我们动态查询所有属性(列)名称,获取每个属性的值(单元格值),并比较它们。如果它们不匹配,我们会发出警告。基于此示例中的单个,不匹配的“单元格”,我得到的输出在下面的屏幕截图中。它似乎在我的测试中运作良好。

注意:即使它说第1行不匹配,你可能认为它是第2行,那是因为数组是从零开始的。因此,在数组术语中,#1实际上是#2,因为它从零开始计数。

# Import both CSV files
$Csv1 = Import-Csv -Path C:\test\csv1.csv;
$Csv2 = Import-Csv -Path C:\test\csv2.csv;

# For each line in CSV1 ...
foreach ($Line1 in $Csv1) {
    $LineNumber = $Csv1.IndexOf($Line1);
    # Get the same line from CSV2
    $Line2 = $Csv2[$LineNumber];

    # For each property (column) ...
    foreach ($Property in (Get-Member -InputObject $Line1 -MemberType NoteProperty)) {
        # Get the property's name
        $PropertyName = $Property.Name;
        # If the value of the property doesn't match each CSV file ..
        if ($Line1.$PropertyName -ne $Line2.$PropertyName) {
            # Warn the user
            Write-Warning -Message ('Value of property {0} did not match for line # {1}' -f $PropertyName, $LineNumber);
            # PERFORM SOME CUSTOM ACTION HERE
        };
    }
}

PowerShell ISE Results