0

我正在尝试读取一组以|管道分隔的文本文件,并获取每个文件的特定列中唯一值的数量,以及文件中的行数。我尝试使用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
}
4

2 回答 2

1

Streamreader 会快上亿倍。所以想法是使用 Streamreader 将数据放入内存,然后执行$data = ConvertFrom-Csv -InputObject $result. 之后你会做类似的事情Sort-Object -unique或添加一个-Property来排序。

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

于 2016-11-15T16:52:47.090 回答
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)   
  }
于 2016-11-15T17:15:21.497 回答