计算CSV中的唯一数字(PowerShell或记事本++)

计算CSV中的唯一数字(PowerShell或记事本++),powershell,csv,notepad++,Powershell,Csv,Notepad++,如何在CSV文件中查找唯一数字的计数?在PowerShell ISE中使用以下命令时 1,2,3,4,2 | Sort-Object | Get-Unique 我可以得到唯一的数字,但我无法将其用于CSV文件。例如,如果我使用 $A = Import-Csv C:\test.csv | Sort-Object | Get-Unique $A.Count 它返回0。我想计算给定文件夹中所有文件的唯一编号 我的数据与此类似: Col1,Col2,Col3,Col4 5,,7,4 0,,9, 3

如何在CSV文件中查找唯一数字的计数?在PowerShell ISE中使用以下命令时

1,2,3,4,2 | Sort-Object | Get-Unique
我可以得到唯一的数字,但我无法将其用于CSV文件。例如,如果我使用

$A =  Import-Csv C:\test.csv | Sort-Object | Get-Unique
$A.Count
它返回0。我想计算给定文件夹中所有文件的唯一编号

我的数据与此类似:

Col1,Col2,Col3,Col4 5,,7,4 0,,9, 3,,5,4 结果应该是6个唯一的值,最好写在同一个CSV文件中


或者用记事本++更容易做到这一点?到目前为止,我只找到了如何计算唯一行的示例。

您可以尝试以下PSv3+:

PS> (Import-CSV C:\test.csv |
      ForEach-Object { $_.psobject.properties.value -ne '' } |
        Sort-Object -Unique).Count
6
关键是从每个输入对象CSV行中提取所有属性列值,这就是$\ psobject.properties.value所做的

-ne过滤掉空值

请注意,如果Sort对象有一个-Unique开关,则不需要Get Unique,只有在输入已经排序的情况下才需要Get Unique

也就是说,如果您的CSV文件的结构与您的一样简单,您可以通过将其作为文本文件PSv2+读取来加快处理速度:

PS> (Get-Content C:\test.csv | Select-Object -Skip 1 | 
      ForEach-Object { $_ -split ',' -ne '' } |
        Sort-Object -Unique).Count
6
获取内容以字符串行的形式读取CSV文件

选择对象-跳过1跳过标题行

$\拆分','-ne通过逗号将每行拆分为值,并删除空值

至于你尝试了什么:

导入CSV C:\test.CSV |排序对象|获取唯一性:

从根本上说,Sort对象以排序的顺序作为一个整体发送输入对象,它不提取属性值,但这正是您所需要的

由于无-Property参数被传递给Sort对象以作为排序的基础,因此它会将导入Csv的自定义对象作为一个整体,通过它们的.ToString值进行比较,该值恰好为空[1] ,因此它们都进行相同的比较,实际上不会进行排序

类似地,Get Unique也通过这里的.ToString来确定唯一性,因此,所有对象都被视为相同的,只有第一个对象被输出


[1] 这可能令人惊讶,因为在可扩展字符串中使用自定义对象确实会产生一个值:compare$obj=[pscustomobject]@{foo='bar'}$obj.ToString;'--'$obj。此不一致性在中进行了讨论。

您可以尝试以下PSv3+:

PS> (Import-CSV C:\test.csv |
      ForEach-Object { $_.psobject.properties.value -ne '' } |
        Sort-Object -Unique).Count
6
关键是从每个输入对象CSV行中提取所有属性列值,这就是$\ psobject.properties.value所做的

-ne过滤掉空值

请注意,如果Sort对象有一个-Unique开关,则不需要Get Unique,只有在输入已经排序的情况下才需要Get Unique

也就是说,如果您的CSV文件的结构与您的一样简单,您可以通过将其作为文本文件PSv2+读取来加快处理速度:

PS> (Get-Content C:\test.csv | Select-Object -Skip 1 | 
      ForEach-Object { $_ -split ',' -ne '' } |
        Sort-Object -Unique).Count
6
获取内容以字符串行的形式读取CSV文件

选择对象-跳过1跳过标题行

$\拆分','-ne通过逗号将每行拆分为值,并删除空值

至于你尝试了什么:

导入CSV C:\test.CSV |排序对象|获取唯一性:

从根本上说,Sort对象以排序的顺序作为一个整体发送输入对象,它不提取属性值,但这正是您所需要的

由于无-Property参数被传递给Sort对象以作为排序的基础,因此它会将导入Csv的自定义对象作为一个整体,通过它们的.ToString值进行比较,该值恰好为空[1] ,因此它们都进行相同的比较,实际上不会进行排序

类似地,Get Unique也通过这里的.ToString来确定唯一性,因此,所有对象都被视为相同的,只有第一个对象被输出


[1] 这可能令人惊讶,因为在可扩展字符串中使用自定义对象确实会产生一个值:compare$obj=[pscustomobject]@{foo='bar'}$obj.ToString;'--'$obj。这种不一致性在。

nice中进行了讨论,这是一个布局良好的书面回答。很高兴看到您在“PowerShell”标签下的贡献。我感谢您的反馈@AdamParsons.nice,这是一个非常详细的书面回答。“很高兴看到您在“PowerShell”标签下的贡献。我感谢您的良好反馈,@AdamParsons。