PowerShell - 多个文件列中的不同值

时间:2016-11-15 16:48:30

标签: powershell count unique streamreader import-csv

我正在尝试读取一组|管道分隔的文本文件,并获取每个文件的特定列中的唯一值的数量,以及文件中的行数。我尝试使用Import-CSV,但这需要花费数小时而耗费大量内存。文件范围从20MB到500MB,10-15个文件。

使用流阅读器会更快吗?我如何计算独特的价值?

Get-ChildItem .\*filtered.txt -Name  | 
ForEach-Object {
    if($dayofweek -eq 1) {
        $importFile = Import-Csv $_ -Delimiter '|'
    } else {
        $importFile = Import-Csv $_ -Delimiter '|' -Header @("a", "Order-ID", "c", "d", "e", "f", "g", "h")
    }
    $numRows = $importFile | Measure-Object | Select-Object -expand count
    $numUniqueOrderID = $importFile | Select Order-ID -Unique
    echo "Filename: $_ `t Rows: $numRows `t"
    echo "Unique Order-IDs"
    $numUniqueOrderID
    echo `n
}

2 个答案:

答案 0 :(得分:0)

Streamreader将快十万倍。因此,我们的想法是使用Streamreader将数据存入内存,然后执行$data = ConvertFrom-Csv -InputObject $result。然后,您可以执行类似Sort-Object -unique的操作或添加-Property进行排序。

编辑:或者,如果你不想弄乱Streamreader,你可以使用$content = Get-Content $file -ReadCount 0,是的,你会失去0.01%的效率,但为什么要这么麻烦。

答案 1 :(得分:0)

没有确定性

Get-ChildItem .\*filtered.txt -File   | 
% {
    if($dayofweek -eq 1) 
     {$numUniqueOrderID = (Import-Csv $_.FullName -Delimiter '|' | Select Order-ID -Unique).Count} 
    else 
     {$numUniqueOrderID = (Import-Csv $_.FullName -Delimiter '|' -Header "a", "Order-ID", "c", "d", "e", "f", "g", "h" | Select Order-ID -Unique).Count}

    $numRows = (gc $_.FullName  -ReadCount 0).Count
    write-host ("Filename: {0}`t Rows : {1}`nUnique Order-IDs : {2}`n" -f $_, $numRows, $numUniqueOrderID)   
  }