【问题标题】:Compare two csv entries in powershell比较powershell中的两个csv条目
【发布时间】:2014-08-15 21:14:07
【问题描述】:

我只是在学习 powershell,但遇到了这个让我难过的错误。目标是获取一个 csv 文件并确定文件中有多少组。每个组下会有多个条目。最终结果是根据组将文件拆分为不同的数组/字典/whathaveyou(我在 3 小时前开始使用 powershell ..),保持 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() 抛出一个关于它不是有效方法的错误。

我很困惑,需要帮助。

【问题讨论】:

  • 你会提前知道会有多少组吗?
  • 很遗憾没有,我现在只是在进行比较。完成后,我可以将变量 $numgroups 绑定到动态创建我需要的组数......无论如何,这就是计划
  • 我确信我可以提供帮助,但我觉得在宏伟的计划中,当您将整个项目考虑在内时,我们正在寻找一个徒劳的练习。为什么要比较 PowerShell 何时可以为您将事物分组?
  • 听起来不错!我只是在学习,所以我确信我的方法不是最好的。分类单元的分组从它们的值来看并不直观,并且允许重复条目(即多个组中的相同分类单元)。我将编辑 OP,以便您查看实际示例的外观。也许这会有所帮助?

标签: powershell csv


【解决方案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)组数 2)taxonID 的
  • 您可以使用 for 循环。
【解决方案2】:

不需要比较。先把小组分开:

$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

编辑:抱歉,当保安通过对讲机打电话给我并说我的卡车下的水管爆裂,他们需要我去移动我的车辆时,他们正在寻找答案。认为不让我的车辆掉入污水坑比这更重要。

【讨论】:

  • 非常感谢,但这似乎并没有像我认为的那样实际输出组名,就像我认为你要使用“组名:”+$Group.name 一样。希望我可以投票(需要更多代表)。
  • 需要将 $Groups.Name 中的“n”大写 - 否则效果很好!我正在尝试从下面修改循环以仅打印出分类单元 ID,但无法弄清楚如何在不获取 @{Group:xx, TaxonID:xx} 的情况下引用它们。
  • 你真的不需要他的循环来获取分类 ID。我的给你那些(编辑它来解决这个问题,它现在应该正确列出 ID)。此外,您不需要将名称中的 N 大写。我完全按原样运行了 ForEach 循环,并且运行良好。嗯,也许版本不同?
  • 不,我是我的错误。它应该是 ForEach($Group in $Groups) 但我有 ForEach($Group in $Groups.Name) 并且这一切都被抛弃了。
  • 宾果游戏!非常感谢。如果您不介意解释, ($Group in $Groups) 是如何工作的?我以前没有定义 $Group 变量..
猜你喜欢
  • 2011-01-26
  • 2012-10-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多