Mai*_*n21 1 csv powershell notepad++
如何在CSV文件中查找唯一编号的计数?当我在PowerShell ISE中使用以下命令时
1,2,3,4,2 | Sort-Object | Get-Unique
Run Code Online (Sandbox Code Playgroud)
我可以获得唯一的数字,但我无法使用CSV文件.例如,如果我使用
$A = Import-Csv C:\test.csv | Sort-Object | Get-Unique
$A.Count
Run Code Online (Sandbox Code Playgroud)
它返回0.我想计算给定文件夹中所有文件的唯一编号.
我的数据与此类似:
Col1,Col2,Col3,Col4 5,,7,4 0,,9, 3,,5,4
结果应该是6个唯一值(最好写在同一个CSV文件中).
或者用Notepad ++更容易做到这一点?到目前为止,我只找到了如何计算唯一行的示例.
您可以尝试以下(PSv3 +):
PS> (Import-CSV C:\test.csv |
ForEach-Object { $_.psobject.properties.value -ne '' } |
Sort-Object -Unique).Count
6
Run Code Online (Sandbox Code Playgroud)
关键是从每个输入对象(CSV行)中提取所有属性(列)值,这是做什么的$_.psobject.properties.value;
-ne '' 过滤掉空值.
需要注意的是,由于Sort-Object有一个-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
Run Code Online (Sandbox Code Playgroud)
Get-Content 将CSV文件作为一行字符串读取.
Select-Object -Skip 1 跳过标题行.
$_ -split ',' -ne '' 通过逗号将每一行拆分为值,并清除空值.
至于你试过的:
Import-CSV C:\test.csv | Sort-Object | Get-Unique:
从根本上说,作为一个整体Sort-Object发出输入对象(只是按排序顺序),它不提取属性值,但这就是你需要的.
因为没有-Property传递任何参数来Sort-Object进行排序,所以它Import-Csv会根据它们的.ToString()值(它们恰好是空的[1])来
比较整个发出的自定义对象,因此它们都进行比较,实际上不会发生排序.
类似地,Get-Unique也通过.ToString()这里确定唯一性,因此同样地,所有对象被认为是相同的,并且仅输出第一个对象.
[1]这可能会令人惊讶,因为在可扩展字符串中使用自定义对象会产生一个值:compare $obj = [pscustomobject] @{ foo ='bar' }; $obj.ToString(); '---'; "$obj".在GitHub问题中讨论了这种不一致性.
| 归档时间: |
|
| 查看次数: |
903 次 |
| 最近记录: |