比较powershell中的两个csv条目

时间:2014-08-15 21:14:07

标签: powershell csv

我只是在学习powershell,但是已经遇到了这个让我难过的错误。目标是获取csv文件并确定文件中有多少组。每组下面会有多个条目。最终的结果是根据组将文件拆分成不同的数组/字典/ whathaveyou(我从powershell 3hrs前开始..),保持TaxonID完整,然后将它们导出到单独的文件中。但就目前而言,我只是在比较步骤。

我的练习数据看起来像

Group,TaxonID  
AA,1  
AA,2  
BB,3  
BB,4

和真实数据看起来像:

Group,TaxonID
Bilateria_Ropsin,Mus_musculus_Rhabdomeric_MEL  
Bilateria_Ropsin,ROp_OG3TodaroP

为此,我尝试将一行中的组与下一行中的组进行比较。如果它们不同,那么我将一个加到变量中供以后使用。这是我必须做的比较:

Set-Variable -name book -value C:\Users\XXX\Documents\Book1.csv
$work = Import-Csv $book
$numgroups = 0
$i=0
foreach ($Group in $work) {
    $Ogroup = $work[$i] | select-object{$_.Group}
    $nextGroup = $work[$i+1] | select-object{$_.Group}
    $compare = $Ogroup.Equals($nextGroup)
    $compare
    $i++
}

当我打印$ Ogroup和$ nextGroup时,他们会给我正确的对(AA AA,AA BB,BB BB),但是$ compare总是打印出来。使用Compare-Object给出了一个关于$ nextGroup为null的错误。所以我选择使用.Equals()。 CompareTo()抛出一个关于它不是有效方法的错误。

我很难过,需要帮助。

2 个答案:

答案 0 :(得分:1)

您应该使用Group-Object CmdLet

Set-Variable -name book -value C:\Users\XXX\Documents\Book1.csv
$work = Import-Csv $book

$groups = $work | Group-Object -Property Group
$groups.count
$groups[0].name
$groups[0].Group[0]
for ($i=0 ; $i -lt $groups.count ; $i++) { $groups[$i].name}

for ($i = 0 ; $i -lt $groups.count ; $i++)
{ 
  $groups[$i].name;
  for ($j=0 ; $j -lt $groups[$i].count;$j++)
  {
    $groups[$i].group[$j]
  }
}

答案 1 :(得分:0)

不需要比较。首先拆分组:

$book = "$env:USERPROFILE\Documents\Book1.csv"
$work = Import-CSV $book
$Groups = $work | Group-Object Group
ForEach($Group in $Groups){
    "Group Name: "+$Group.name
    "Taxon IDs: "
    $Group.group.TaxonID
}

如果要将每个组保存到一个文件,在该ForEach循环中,您可以执行$ Group | export-csv“c:\ path \ $($ Group.name).csv”-notypeinfo

编辑抱歉,当安全人员通过对讲机打电话给我时,我正在努力寻找答案,并说我的卡车下面有一个水管爆裂,他们需要我移动我的车辆。想到没有把我的车丢到一个下水道比这更重要。