计算CSV中的唯一数字(PowerShell或记事本++)
如何在CSV文件中查找唯一数字的计数?在PowerShell ISE中使用以下命令时计算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
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。