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

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 に答える