我只是在学习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()抛出一个关于它不是有效方法的错误。
我很难过,需要帮助。
答案 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
编辑抱歉,当安全人员通过对讲机打电话给我时,我正在努力寻找答案,并说我的卡车下面有一个水管爆裂,他们需要我移动我的车辆。想到没有把我的车丢到一个下水道比这更重要。